पूर्ववत खींचो, कैसे पुरानी स्थिति में repos लाने के लिए


1006

क्या गीट पुल को वापस या पूर्ववत करने का कोई तरीका है ताकि मेरा स्रोत / रिपोज पुरानी स्थिति में आ जाए जो कि गिट पुल खींचने से पहले था? मैं ऐसा करना चाहता हूं क्योंकि इसने कुछ फाइलों को मर्ज कर दिया है जो मैं ऐसा नहीं करना चाहता था, लेकिन केवल अन्य बची हुई फाइलों को मर्ज कर देता हूं। इसलिए, मैं उन फाइलों को वापस लाना चाहता हूं, क्या यह संभव है?

संपादित करें: मैं स्पष्टीकरण के लिए मर्ज पूर्ववत करना चाहता हूं। कुछ जवाब देखने के बाद, मैंने ऐसा किया

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

किया करू अब ? करते हुएgit reset --hard ठीक है? मैं इसे फिर से पेंच नहीं करना चाहता, इसलिए विस्तृत चरणों के लिए पूछ रहा हूं?


23
ऐसा लगता है कि आपके इतिहास में केवल दो चीजें हैं: एक क्लोन और एक भ्रूण। केवल क्लोन पर रीसेट करें: git reset --hard 01b34faइस स्थिति में आप ऐसा कर सकते हैं git reset --hard HEAD^जो HEAD से पहले एक कमेटी को रीसेट करता है।
16

2
-हार्ड आवश्यक है यदि आप अपने कामकाजी डायर में फाइलों को संशोधित करना चाहते हैं
विलियम पर्ससेल 17'09

3
@ seg.server.fault: यदि यह काम करता है, तो आप हमेशा जवाब स्वीकार कर सकते हैं;)
jkp

7
git reset --hard HEAD ^
फनल

7
git reflogसब कुछ दिखाएगा कि क्या किया गया है। एक चिंता है कि git reset --hard [sha1 of something from reflog]जो कुछ दिखाया गया है reflog, जो कभी-कभी गोल नहीं होता है, जैसे सब कुछ वापस कर देगा । आप खराब डेटा (होता है) के साथ मूल से खींची गई मास्टर शाखा पर मर्ज वापस करना चाहते हैं, और उस मर्ज के बाद आपने अन्य शाखाओं पर काम किया है। reflogअन्य शाखाओं पर हर पीछा दिखाएगा। लेकिन git checkout masterऔर git reset --hard [SH1 of commit on master branch just before merge]केवल मौजूदा मास्टर शाखा को हटा देगा जो मूल से खींचे गए मर्ज को हटा देगा।
व्लादिमीर वुकानैक

जवाबों:


1427

रनिंग git pullक्रम में, निम्न कार्य करता है:

  1. git fetch
  2. git merge

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

मर्ज को पूर्ववत् करने के लिए , git reset --hardस्थानीय रिपॉजिटरी को पिछली स्थिति में रीसेट करने के लिए उपयोग करें; git-reflog का उपयोग करेंपिछली स्थिति के SHA-1 को खोजने के लिए का और फिर इसे रीसेट करें।

चेतावनी

इस खंड में सूचीबद्ध आदेश सभी अप्रभावित परिवर्तनों को हटा देते हैं, जो संभावित रूप से काम के नुकसान की ओर ले जाते हैं:

git reset --hard

वैकल्पिक रूप से, समय में एक विशेष बिंदु पर रीसेट करें, जैसे:

git reset --hard master@{"10 minutes ago"}

325
एक शानदार तरीका बजाय Git-reflog और कॉपी करने हैश के उपयोग की, पहले वाली स्थिति लेने के लिए, की तरह एक शॉर्टकट का उपयोग करने के लिए है master@{1}, की पिछली स्थिति है जो master, master@{"5 minutes ago"}, या master@{14:30}। इस तरह से संशोधनों को निर्दिष्ट करने पर पूर्ण विवरण man git-rev-parse"संशोधन संशोधित" नामक अनुभाग में पाया जा सकता है ।
Cascabel

38
इस मामले में ORIG_HEAD को भी काम करना चाहिए ("git reset --hard ORIG_HEAD")
जेकब नार'बस्की

@ जोल्प्रोमी: उस टिप के लिए धन्यवाद, मुझे पता नहीं था कि आप संशोधन के बारे में इतनी वाचाल हो सकते हैं। मुझे HEAD के सापेक्ष संशोधन लेने के बारे में पता था, लेकिन जब प्रश्न सामने आया तो मुझे नहीं पता था कि वह कितने समय पहले वापस जाना चाहता था।
jkp

जब मैंने खींचा, तो यह कहता है Updating d2c90a3..035ac4d। यहां, आप d2c90a3रीसेट करने के लिए एक पैरामीटर के रूप में भी उपयोग कर सकते हैं ।
थाई

जब आप reflog का उपयोग करते हैं तो आपको हैश टाइप करने की आवश्यकता नहीं होती है। आप HEAD @ {1} या क्या कभी पिछले नंबर का उपयोग कर सकते हैं जैसा कि रिफ्लॉग में परिभाषित किया गया है।
साइमन द कैट

338

Jkp के उत्तर के रूप में भी, लेकिन यहाँ पूरी कमांड है:

git reset --hard a0d3fe6

जहाँ a0d3fe6 करने से पाया जाता है

git reflog

और उस बिंदु को देखना जिस पर आप पूर्ववत करना चाहते हैं।


मैं सिर्फ git reset HEAD --hardउदाहरण के लिए ऐसा क्यों नहीं कर सकता ?
चो

9
@ माइक इस दृष्टिकोण से आप कई पुल वापस जा सकते हैं, उदाहरण के लिए
xji

2
मैं बाईं ओर के आईडी का उपयोग करने में सक्षम नहीं था, लेकिन git reset --hard HEAD@{n}काम किया
ई। सुंदरिन

1
आपको इतने वर्षों के बाद यहाँ लगभग प्रतिकृति के बजाय jkp के उत्तर को संपादित करने का सुझाव देना चाहिए था।
अभिषेक आनंद

अगर मेरे पास यह है git reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} और bbbbbb HEAD @ {2}। यदि मैं करूँ तो git reset --hard bbbbbbbमैं HEAD 0 और 1 खो दूंगा?
पीरिन्दा

115

मर्ज को पूर्ववत करने का एक और आधुनिक तरीका है:

git merge --abort

और थोड़ा पुराना तरीका:

git reset --merge

पिछले उत्तरों में वर्णित पुराने स्कूल का तरीका (चेतावनी: आपके सभी स्थानीय परिवर्तन छोड़ देगा):

git reset --hard

लेकिन वास्तव में, यह ध्यान देने योग्य git merge --abortहै git reset --mergeकि MERGE_HEADवर्तमान में दिए गए के बराबर है। यह मर्ज कमांड के लिए git सहायता में पढ़ा जा सकता है।

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

एक असफल मर्ज के बाद, जब कोई नहीं होता है MERGE_HEAD, तो असफल मर्ज को पूर्ववत किया जा सकता है, git reset --mergeलेकिन जरूरी नहीं कि साथ ही git merge --abort, इसलिए वे केवल एक ही चीज़ के लिए पुराने और नए सिंटैक्स नहीं हैं । यही कारण है कि मैं git reset --mergeरोजमर्रा के काम में बहुत अधिक उपयोगी है।


20
git merge --abortएक मर्ज का काम करता है, git pullसमाप्त होने के बाद नहीं । तो यह उत्तर प्रश्न के लिए अप्रासंगिक लगता है।
अभिषेक आनंद

1
git reset --mergeउन सभी परिवर्तनों को हटाता है जो प्रतिबद्ध नहीं हैं। यह कठिन रास्ता मिल गया।
थिड़ीयाग्रीन


40

यदि आपके पास gitk है ("gitk --all को अपनी git कमांड लाइन से चलाने की कोशिश करें"), यह सरल है। बस इसे चलाएं, उस कमेट का चयन करें जिसे आप रोलबैक करना चाहते हैं (राइट-क्लिक करें), और "यहां पर मास्टर रीसेट करें" चुनें। यदि आपके पास कोई भी अनपेक्षित परिवर्तन नहीं है, तो "कठिन" विकल्प चुनें।


8
यदि आपने इसे नहीं देखा है तो यह चलने लायक है। यह एक पागल जीयूआई पॉप अप करता है।
इवान मोरन

35

मान लीजिए $COMMITकि आपके प्रदर्शन से पहले अंतिम प्रतिबद्ध आईडी थी git pull। अंतिम पुल को पूर्ववत करने के लिए आपको क्या करने की आवश्यकता है

git reset --hard $COMMIT

बक्शीश:

पुल के बोलने में, मैं एक दिलचस्प ट्रिक शेयर करना चाहूंगा,

git pull --rebase

यह उपर्युक्त कमांड मेरे git जीवन में सबसे उपयोगी कमांड है जिसने बहुत समय बचाया।

अपने नए कमिट को सर्वर पर धकेलने से पहले, इस कमांड को आज़माएँ और यह स्वचालित रूप से लेटेस्ट सर्वर चेंजेस (एक लिक्विड + मर्ज के साथ) सिंक करेगा और आपकी कमिट को git लॉग में सबसे ऊपर रखेगा। मैनुअल पुल / मर्ज के बारे में चिंता करने की आवश्यकता नहीं है।

यहाँ विवरण प्राप्त करें: http://gitolite.com/git-pull--rebase


17

परिवर्तनों को वापस लाने का यह सबसे आसान तरीका है।

** Warning **

कृपया अपनी परिवर्तित फ़ाइलों का बैकअप लें क्योंकि यह नई बनाई गई फ़ाइलों और फ़ोल्डरों को हटा देगा

git reset --hard 9573e3e0

9573e3e0आपकी {प्रतिबद्ध आईडी} कहां है


यह प्रतिक्रिया बहुत उपयोगी है, क्योंकि अगर हम एक git पुल ओरिजिन ब्रांच wi प्राप्त करते हैं तो कुछ ऐसा ही करते हैं Updating ffce65bd..e929e884, ऐसाgit reset --hard ffce65bd
Ernesto Alfonso

15

तुम कर सकते हो git reset --hard ORIG_HEAD

चूंकि "पुल" या "मर्ज" उन कार्यों को करने से पहले ORIG_HEAD को वर्तमान स्थिति के रूप में सेट करते हैं।


5

गिट पुल ऑपरेशन के नीचे करते हैं।

मैं। git fetch

ii। git merge

किसी भी ऑपरेशन को करने के लिए पूर्ववत करें:

मैं। git reset --hard --- इसके सभी स्थानीय परिवर्तन भी वापस

या

ii। git reset --hard master@{5.days.ago} (जैसे 10.minutes.ago, 1.hours.ago, 1.days.ago..) स्थानीय परिवर्तन प्राप्त करने के लिए।

या

iii। git reset --hard commitid

सुधार की:

अगली बार के git pull --rebaseबजाय git pull.. (सिंक और मर्ज) करके इसके सिंक सर्वर परिवर्तन का उपयोग करें ।


4

यदि कोई विफल मर्ज है, जो कि पूर्ववत करने की इच्छा के लिए सबसे आम कारण है git pull, तो दौड़ना git reset --mergeबिल्कुल वही होता है जो कोई उम्मीद करता है: प्राप्त फ़ाइलों को रखें, लेकिन विलय git pullकरने का प्रयास करने वाले मर्ज को पूर्ववत करें । फिर कोई यह तय कर सकता है कि उस अव्यवस्था के बिना क्या करना है जो git mergeकभी-कभी उत्पन्न होती है। और इसे सटीक प्रतिबद्ध आईडी खोजने के लिए एक की आवश्यकता नहीं है जो --hardकि हर दूसरे उत्तर में उल्लिखित है।

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