मैं Git प्रबंधित परियोजना में पिछले राज्य में सभी स्थानीय परिवर्तनों को कैसे वापस करूँ?


1913

मेरे पास एक परियोजना है जिसमें मैं भाग गया git init। कई कमिट करने के बाद, मैंने किया git statusजिसने मुझे बताया कि सब कुछ अप टू डेट था और कोई स्थानीय परिवर्तन नहीं थे।

फिर मैंने लगातार कई बदलाव किए और महसूस किया कि मैं सब कुछ निकाल कर वापस अपनी मूल स्थिति में लाना चाहता हूं। क्या यह आज्ञा यह मेरे लिए करेगी?

git reset --hard HEAD

जवाबों:


3387

यदि आप अपनी कार्य प्रतिलिपि में किए गए परिवर्तनों को वापस करना चाहते हैं, तो यह करें:

git checkout .

यदि आप अनुक्रमणिका में किए गए परिवर्तनों को वापस करना चाहते हैं (यानी, जो आपने जोड़ा है), ऐसा करें। यह चेतावनी आपके सभी अप्रकाशित कमिटों को मास्टर में रीसेट कर देगी! :

git reset

यदि आप अपने द्वारा किए गए परिवर्तन को वापस करना चाहते हैं, तो यह करें:

git revert <commit 1> <commit 2>

यदि आप अनट्रैक की गई फ़ाइलों को हटाना चाहते हैं (उदाहरण के लिए, नई फ़ाइलें, उत्पन्न फ़ाइलें):

git clean -f

या अनट्रेक्ड निर्देशिका (उदाहरण के लिए, नई या स्वचालित रूप से जेनरेट की गई निर्देशिका):

git clean -fd

133
fwiw इतने लंबे समय के बाद, git checkout path/to/fileकेवल स्थानीय परिवर्तनों को वापस कर देगाpath/to/file
Matijs

29
नीचे दिए गए उत्तरों पर +1 भी git clean -f (अनट्रैक किए गए बदलावों को हटाने के लिए) और
-fd

3
और अगर आप भी अपने ट्रैक न किए गए फ़ाइलों को साफ करना चाहते हैं, यह पढ़ stackoverflow.com/questions/61212/...
Surasin Tancharoen

9
git checkout .और git reset [--hard HEAD]काम नहीं किया, मुझे git clean -fdअपने परिवर्तनों को वापस करने के लिए एक करना पड़ा ।
BrainSlugs83

7
git resetअपने परिवर्तनों को रीसेट नहीं करता, git reset --hardऐसा करता है।
सेरिन जूल

388

नोट: आप भी चलाना चाह सकते हैं

git clean -fd

जैसा

git reset --hard

अनटैक की गई फ़ाइलों को नहीं हटाएगा, जहाँ गिट-क्लीन ट्रैक किए गए रूट डायरेक्टरी से किसी भी फाइल को हटा देगा, जो गिट ट्रैकिंग के अधीन नहीं हैं। चेतावनी - इस के साथ सावधान रहना! यह पहले गीट-क्लीन के साथ ड्राई-रन चलाने में सहायक है, यह देखने के लिए कि यह क्या डिलीट करेगा।

त्रुटि संदेश मिलने पर यह विशेष रूप से उपयोगी भी है

~"performing this command will cause an un-tracked file to be overwritten"

जो कई चीजों को करते समय हो सकता है, एक जब आप और आपके दोस्त दोनों एक ही नाम की एक नई फ़ाइल जोड़ रहे हैं, तो एक कार्यशील प्रतिलिपि को अपडेट किया जा रहा है, लेकिन वह इसे पहले स्रोत नियंत्रण में प्रतिबद्ध है, और आप अपनी नकल को हटाने के बारे में परवाह नहीं करते हैं ।

इस स्थिति में, सूखा रन करने से आपको उन फ़ाइलों की एक सूची दिखाने में मदद मिलेगी, जो ओवरराइट हो जाएंगे।


13
फ़ाइल क्लीन कमांड "git clean -f" है। अनट्रैक निर्देशिकाओं को "गिट क्लीन -d" के साथ हटा दिया जाता है
जोनाथन मिशेल

35
git clean -fd (-d के लिए बल की आवश्यकता होती है)
Electblake

14
-n या-dry- रन ड्राई-रन के लिए ध्वज हैं।
Stephenbez

2
अगर आप अपने git रिपॉजिटरी में एक और git रिपॉजिटरी रखते हैं, तो git को साफ करें। डबल च के बिना इसे हटाया नहीं जाएगा।
Trismegistos

147

पुन: क्लोन

GIT=$(git rev-parse --show-toplevel)
cd $GIT/..
rm -rf $GIT
git clone ...
  • ✅ स्थानीय, गैर-धक्का दिया हटाता है
  • । आपके द्वारा ट्रैक की गई फ़ाइलों में किए गए परिवर्तन को बदलता है
  • Ores आपके द्वारा हटाई गई फ़ाइलों को पुनर्स्थापित करता है
  • ✅ फाइलों को डिलीट / डायर किया गया है .gitignore(जैसे बिल्ड फाइल्स)
  • ✅ फाइल को डिलीट / डीआरएस किया जाता है जो ट्रैक नहीं किया जाता है और न ही अंदर होता है .gitignore
  • This आप इस दृष्टिकोण को नहीं भूलेंगे
  • 😔 अपशिष्ट बैंडविड्थ

निम्नलिखित अन्य आदेश हैं जिन्हें मैं रोजाना भूल जाता हूं।

साफ और रीसेट करें

git clean --force -d -x
git reset --hard
  • ❌ स्थानीय, गैर-धक्का दिया हटाता है
  • । आपके द्वारा ट्रैक की गई फ़ाइलों में किए गए परिवर्तन को बदलता है
  • Ores आपके द्वारा हटाई गई फ़ाइलों को पुनर्स्थापित करता है
  • ✅ फाइलों को डिलीट / डायर किया गया है .gitignore(जैसे बिल्ड फाइल्स)
  • ✅ फाइल को डिलीट / डीआरएस किया जाता है जो ट्रैक नहीं किया जाता है और न ही अंदर होता है .gitignore

स्वच्छ

git clean --force -d -x
  • ❌ स्थानीय, गैर-धक्का दिया हटाता है
  • ❌ आपके द्वारा ट्रैक की गई फ़ाइलों में किए गए परिवर्तन को बदलता है
  • Ores आपके द्वारा हटाई गई फ़ाइलों को पुनर्स्थापित करता है
  • ✅ फाइलों को डिलीट / डायर किया गया है .gitignore(जैसे बिल्ड फाइल्स)
  • ✅ फाइल को डिलीट / डीआरएस किया जाता है जो ट्रैक नहीं किया जाता है और न ही अंदर होता है .gitignore

रीसेट

git reset --hard
  • ❌ स्थानीय, गैर-धक्का दिया हटाता है
  • । आपके द्वारा ट्रैक की गई फ़ाइलों में किए गए परिवर्तन को बदलता है
  • Ores आपके द्वारा हटाई गई फ़ाइलों को पुनर्स्थापित करता है
  • ❌ फाइलों को डिलीट / डायर किया गया है .gitignore(जैसे बिल्ड फाइल्स)
  • ❌ फाइल को डिलीट / डीआरएस किया जाता है जो ट्रैक नहीं किया जाता है और न ही अंदर होता है .gitignore

टिप्पणियाँ

उपरोक्त सभी की पुष्टि के लिए टेस्ट केस (bash या sh का उपयोग करें):

mkdir project
cd project
git init
echo '*.built' > .gitignore
echo 'CODE' > a.sourceCode
mkdir b
echo 'CODE' > b/b.sourceCode
cp -r b c
git add .
git commit -m 'Initial checkin'
echo 'NEW FEATURE' >> a.sourceCode
cp a.sourceCode a.built
rm -rf c
echo 'CODE' > 'd.sourceCode'

यह सभी देखें

  • git revert पूर्व में किए गए नए कमिट करने के लिए
  • git checkout समय से पहले वापस जाने के लिए (पहले कमांड से ऊपर चलने की आवश्यकता हो सकती है)
  • git stashgit resetऊपर जैसा है, लेकिन आप इसे पूर्ववत कर सकते हैं

उपरोक्त उत्तरों से चोरी करने के लिए क्षमा करें। मैं इस संदर्भ का लगातार उपयोग करता हूं, मेरे लिए ज्यादातर पोस्ट करता है।
विलियम एंट्रीकेन

1
मुझे पूरा यकीन है, कि पहला विकल्प ( रि-क्लोन ) वास्तव में "स्थानीय, गैर-धकेल दिया गया"
हटाता है

1
@styfle something कुछ ऐसा करता है, it कुछ ऐसा है जो यह नहीं करता है
विलियम एंट्रिएक

3
@FullDecent यह पढ़ने में भ्रमित करने वाला है। ", स्थानीय, गैर-धक्का वाले कमिट्स को नष्ट नहीं करता है"। इसका मतलब है कि यह नष्ट नहीं करता है। दोहरे नकारात्मक का मतलब है कि यह हटाता है?
स्टाइलफेल

1
के बारे में -x ध्वज git clean -f -d -x: यदि -x विकल्प निर्दिष्ट किया जाता है, तो उपेक्षित फ़ाइलें भी हटा दी जाती हैं। यह, उदाहरण के लिए, सभी बिल्ड उत्पादों को हटाने के लिए उपयोगी हो सकता है
एलेक्स

82

यदि आप सभी परिवर्तनों को वापस करना चाहते हैं और वर्तमान दूरस्थ मास्टर के साथ अप-टू-डेट होना चाहते हैं (उदाहरण के लिए आप पाते हैं कि मास्टर HEAD आगे बढ़ गया है क्योंकि आपने इसे बंद कर दिया है और आपका धक्का 'अस्वीकृत' हो रहा है) तो आप इसका उपयोग कर सकते हैं

git fetch  # will fetch the latest changes on the remote
git reset --hard origin/master # will set your local branch to match the representation of the remote just pulled down.

यह निर्दिष्ट करने के लिए महत्वपूर्ण लगता है originमें git reset --hard origin/master(जो काम करता है) - बिना यह (यानी git reset --hard) कुछ भी नहीं बदला जा रहा है।
जेक

मेरे पास कुछ स्थानीय परिवर्तन थे और किसी भी आदेश से मैंने उन्हें छुटकारा पाने में सक्षम नहीं किया था - मैंने मूल / मास्टर को रीसेट किया था और यह मास्टर के परिवर्तनों को भी खींचने में सक्षम था
अभिषेक रिंगिया

50

Git-reflog में देखें। यह उन सभी राज्यों को सूचीबद्ध करेगा जो इसे याद करते हैं (डिफ़ॉल्ट 30 दिन है), और आप बस अपने इच्छित चेकआउट कर सकते हैं। उदाहरण के लिए:

$ git init > /dev/null
$ touch a
$ git add .
$ git commit -m"Add file a" > /dev/null
$ echo 'foo' >> a
$ git commit -a -m"Append foo to a" > /dev/null
$ for i in b c d e; do echo $i >>a; git commit -a -m"Append $i to a" ;done > /dev/null
$ git reset --hard HEAD^^ > /dev/null
$ cat a
foo
b
c
$ git reflog
145c322 HEAD@{0}: HEAD^^: updating HEAD
ae7c2b3 HEAD@{1}: commit: Append e to a
fdf2c5e HEAD@{2}: commit: Append d to a
145c322 HEAD@{3}: commit: Append c to a
363e22a HEAD@{4}: commit: Append b to a
fa26c43 HEAD@{5}: commit: Append foo to a
0a392a5 HEAD@{6}: commit (initial): Add file a
$ git reset --hard HEAD@{2}
HEAD is now at fdf2c5e Append d to a
$ cat a
foo
b
c
d

धन्यवाद एक टन विलियम, गिट रिफ्लॉग के लिए। मैंने अपने पेड़ को पुराने संस्करण में रीसेट कर दिया है और सुनिश्चित नहीं है कि हाल ही में कैसे फिर से बेचना है। आपके गिट रिफ्लग ने मुझे बचा लिया। एक बार फिर से धन्यवाद।
पालनिराज

1
मुझे भी बचाया! मेरे मामले में मेरा साहस git rebase -iगलत हो गया था (एक संपादन गलती के कारण कुछ कमियों को मिटा देना)। इस टिप के लिए धन्यवाद मैं एक अच्छे राज्य में वापस आ गया हूँ!
paneer_tikka

आप 30 दिनों के डिफ़ॉल्ट रूप से क्या मतलब है?
मोहे थ्रेड्री

@MoheTheDreamy मेरा मतलब है कि समय सीमा है। आखिरकार कचरा इकट्ठा करने वाला अप्राप्य संदर्भ हटा देगा जब उनकी आयु उस सीमा से अधिक हो जाएगी। 30 दिनों के लिए डिफ़ॉल्ट (और शायद अभी भी है) हुआ करता था। इसलिए पुराने संदर्भ उपलब्ध नहीं हो सकते हैं।
विलियम पर्ससेल

36

DANGER AHEAD: (कृपया टिप्पणियों को पढ़ें। मेरे उत्तर में प्रस्तावित आदेश को निष्पादित करने से आप जितना चाहें उतना हटा सकते हैं)

पूरी तरह से निर्देशिकाओं सहित सभी फाइलों को हटाने के लिए मुझे दौड़ना पड़ा

git clean -f -d

13
किसी के भी दर्द से बचने के लिए मैं अभी-अभी गुजरा हूँ: यह .ignignore-d फाइलें भी मिटा देगा!
लैंड्सन

क्षमा करें यदि मैंने आपको कोई परेशानी दी। वापस तो मैंने बस उस फ़ोल्डर में सब कुछ वापस करने और हटाने की कोशिश की। मुझे सटीक परिस्थितियों की याद नहीं है, लेकिन "-d" केवल मेरे लिए काम कर रहा था। मुझे आशा है कि मैंने आपको बहुत दर्द नहीं दिया है :-)
टोबियास गैसमैन

1
कोई नुकसान नहीं किया। मेरे पास बैकअप था, लेकिन यह शायद एक अस्वीकरण को वारंट करता है;)
लैंड

35

उत्तरों का एक गुच्छा पढ़ने और उन्हें आज़माने के बाद, मैंने विभिन्न किनारे मामलों को पाया है, जिसका अर्थ है कि कभी-कभी वे काम की प्रतिलिपि को पूरी तरह से साफ नहीं करते हैं।

यह करने के लिए मेरी वर्तमान बैश स्क्रिप्ट है, जो हर समय काम करती है।

#!/bin/sh
git reset --hard
git clean -f -d
git checkout -- HEAD

वर्किंग कॉपी रूट डायरेक्टरी से चलाएं।


10
अंतिम कमांड मुझे देता हैerror: pathspec 'HEAD' did not match any file(s) known to git.
0xC0000022L

1
मेरे लिए यह तब काम आया जब मैंने "-" को बाहर निकाला। git checkout HEAD
जस्टर

4
git reset --hardreverts ट्रैक की गई फ़ाइलें (चरणबद्ध हैं या नहीं), git clean -f -dअनटैक की गई फ़ाइलों को हटा देती है, git checkout -- HEADफिर हमें इसकी आवश्यकता क्यों है?
v.shashenko

हमें डबल हाइफ़न की आवश्यकता नहीं है। एक टाइपो होना चाहिए।
फरक्स

35

बस निष्पादित करें -

git stash

यह आपके सभी स्थानीय परिवर्तनों को हटा देगा। और आप इसे बाद में निष्पादित करके भी उपयोग कर सकते हैं -

git stash apply 

3
उपयोग git stash popस्वचालित रूप से आपके लिए सबसे बड़ा परिवर्तन हटा देगा
तीर सेन

8
git stash dropकार्यशील प्रतिलिपि पर लागू किए बिना नवीनतम क्रमबद्ध स्थिति को हटाने के लिए।
दीरचो


27

मैं एक ऐसी ही समस्या से मिला। समाधान यह git logदेखने के लिए उपयोग करना है कि स्थानीय प्रतिबद्ध का कौन सा संस्करण रिमोट से अलग है। (जैसे संस्करण है 3c74a11530697214cbcc4b7b98bf7a65952a34ec)।

फिर git reset --hard 3c74a11530697214cbcc4b7b98bf7a65952a34ecपरिवर्तन को वापस करने के लिए उपयोग करें।


16

मैंने इसी तरह के मुद्दे की तलाश की,

स्थानीय आवागमन को दूर करना चाहते हैं:

  1. रिपॉजिटरी क्लोन किया (गिट क्लोन)
  2. देव शाखा पर स्विच किया गया (git चेकआउट देव)
  3. कुछ कमिट किया (git कमिट-एम "कमिट 1")
  4. लेकिन दूर जाने के लिए इन स्थानीय कमिटों को दूर फेंकने का फैसला किया (मूल / देव)

तो नीचे किया है:

git reset --hard origin/dev

चेक:

git status  

        On branch dev  
        Your branch is up-to-date with 'origin/dev'.  
        nothing to commit, working tree clean  

अब स्थानीय कमिट खो गए हैं, प्रारंभिक क्लोन स्थिति में वापस, बिंदु 1 ऊपर।


1
धन्यवाद, यह केवल एक चीज है जो मेरे लिए काम की है - "git reset --hard origin"
निसिम नईम

यह जानकर खुशी हुई।
मनोहर रेड्डी ने 27

7

जरूरी नहीं कि आप अपने कामकाजी निर्देशिका में अपने काम / फाइलों को रोकना चाहें, बल्कि इसके बजाय उन्हें पूरी तरह से छुटकारा पा सकते हैं। कमांड git cleanआपके लिए यह करेगी।

ऐसा करने के लिए कुछ सामान्य उपयोग के मामलों को मर्ज या बाहरी उपकरणों द्वारा उत्पन्न किए गए cruft को हटाने या अन्य फ़ाइलों को हटाने के लिए होगा ताकि आप एक स्वच्छ बिल्ड चला सकें।

ध्यान रखें कि आप इस कमांड से बहुत सतर्क रहना चाहते हैं, क्योंकि इसकी डिज़ाइन आपके स्थानीय वर्किंग डायरेक्टरी की फाइलों को हटाने के लिए की गई है जो कि सच नहीं हैं। यदि आप इस कमांड को निष्पादित करने के बाद अचानक अपना दिमाग बदल देते हैं, तो उन फ़ाइलों की सामग्री को देखने के लिए वापस नहीं जाना चाहिए जिन्हें हटा दिया गया था। एक विकल्प जो सुरक्षित है उसे निष्पादित करना है

git stash --all

जो सब कुछ निकाल देगा, लेकिन इसे सभी को बचा सकता है। यह स्टेश बाद में उपयोग किया जा सकता है।

हालाँकि, यदि आप वास्तव में सभी फ़ाइलों को हटाना चाहते हैं और अपनी कार्यशील निर्देशिका को साफ़ करना चाहते हैं, तो आपको निष्पादित करना चाहिए

git clean -f -d

यह किसी भी फाइल और किसी भी उप-निर्देशिका को हटा देगा जिसके पास कमांड के परिणामस्वरूप कोई आइटम नहीं है। git clean -f -dकमांड को निष्पादित करने से पहले एक स्मार्ट चीज को चलाना है

git clean -f -d -n

जिस पर अमल करने के बाद आपको क्या हटाया जाएगा, इसका एक पूर्वावलोकन आपको दिखाई देगा git clean -f -d

इसलिए यहां सबसे आक्रामक से लेकर सबसे कम आक्रामक तक आपके विकल्पों का सारांश है


विकल्प 1 : स्थानीय रूप से सभी फ़ाइलें निकालें (सबसे आक्रामक)

git clean -f -d

विकल्प 2 : उपरोक्त प्रभाव का पूर्वावलोकन करें (सबसे आक्रामक पूर्वावलोकन करें)

git clean -f -d -n

विकल्प 3 : सभी फाइलों को स्‍टेश करें (कम से कम आक्रामक)

`git stash --all` 

6

स्थानीय शाखा में विस्थापित सभी परिवर्तनों को वापस करने के लिए यह प्रयास करें

$ git reset --hard HEAD

लेकिन अगर आपको इस तरह की कोई त्रुटि दिखाई देती है:

fatal: Unable to create '/directory/for/your/project/.git/index.lock': File exists.

आप '.git' फ़ोल्डर में नेविगेट कर सकते हैं। फिर index.lock फ़ाइल को हटा दें:

$ cd /directory/for/your/project/.git/
$ rm index.lock

अंतिम रूप से, फिर से कमांड चलाएँ:

$ git reset --hard HEAD

0

यह प्रश्न व्यापक रिपॉजिटरी रीसेट / रिवर्ट के बारे में अधिक है, लेकिन अगर आप व्यक्तिगत परिवर्तन को बदलने में रुचि रखते हैं - तो मैंने यहाँ भी इसी तरह का उत्तर जोड़ा है:

https://stackoverflow.com/a/60890371/2338477

सवालों के जवाब:

  • गिट इतिहास में संरक्षण को बदलने के साथ या बिना व्यक्तिगत परिवर्तन को वापस कैसे करें

  • उसी राज्य से पुनः आरंभ करने के लिए पुराने संस्करण पर वापस कैसे लौटें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.