'रीसेट रीसेट' को पूर्ववत कैसे करें?


1311

पूर्ववत करने का सबसे सरल तरीका क्या है

git reset HEAD~

आदेश? वर्तमान में, एक ही रास्ता है जिसके बारे में मैं सोच सकता हूँ कि "दूरस्थ क्लोन http: // ..." है।


2
अगर किसी को हार्ड रीसेट को पूर्ववत करने के तरीके की तलाश है, तो जीआईटी रीसेट को अनड्रेस करने में जांचें - HEAD ~ 1 । समाधान बहुत समान हैं।


2
यह संबंधित प्रश्नों का डुप्लिकेट नहीं है --hard! गलती से इस कमांड को चलाने का जोखिम बहुत अधिक है। उदाहरण के लिए, आप किसी एकल फ़ाइल को अस्थिर करना चाहते हैं git reset foo-file। आप केवल फ़ाइल नाम का पहला भाग लिखते हैं, स्वतः पूर्णता के लिए हिट टैब, यह वास्तव में एक शाखा के नाम पर पूरा होता है, आप इसे नोटिस नहीं करते हैं और git reset foo-branchइसके बजाय कमांड चलाते हैं । Voilà
युसिन वाशियो

जवाबों:


2387

संक्षिप्त जवाब:

git reset 'HEAD@{1}'

लंबा जवाब:

Git सभी रेफरी अपडेट्स (जैसे, चेकआउट, रीसेट, कमिट, मर्ज) का लॉग रखता है। आप इसे टाइप करके देख सकते हैं:

git reflog

कहीं न कहीं इस सूची में वह प्रतिबद्धता है जो आपने खोई थी। मान लीजिए कि आप बस टाइप करते हैं git reset HEAD~और इसे पूर्ववत करना चाहते हैं। मेरा रिफ्लोग इस तरह दिखता है:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

पहली पंक्ति कहती है कि HEAD0 स्थिति पहले (दूसरे शब्दों में, वर्तमान स्थिति) 3f6db14 है; इसे रीसेट करके प्राप्त किया गया था HEAD~। दूसरी पंक्ति कहती है कि HEAD1 स्थिति पहले (दूसरे शब्दों में, रीसेट से पहले की स्थिति) d27924e है। यह एक विशेष प्रतिबद्धता की जांच करके प्राप्त किया गया था (हालांकि यह अभी महत्वपूर्ण नहीं है)। इसलिए, रीसेट को पूर्ववत् करने के लिए, चलाएं git reset HEAD@{1}(या git reset d27924e)।

यदि, दूसरी ओर, आपने तब से कुछ अन्य कमांड चलाए हैं, जो उस अपडेट को अपडेट करते हैं, जो आप चाहते हैं वह सूची के शीर्ष पर नहीं होगा, और आपको इसके माध्यम से खोजना होगा reflog

एक अंतिम नोट: reflogजिस विशिष्ट शाखा को आप रीसेट करना चाहते हैं, उसके बजाय मास्टर के बजाय इसे देखना आसान हो सकता है HEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

यह सामान्य से कम शोर होना चाहिए HEAD reflog


25
reflogइस उद्देश्य के लिए अधिक दृश्य और अच्छे विकल्प के रूप में , मैं उपयोग करना पसंद करता हूं git log --graph --decorate --oneline $(git rev-list -g --all)। यह सभी
कमानों

1
आइए बताते हैं कि मेरे पास एक निर्देशिका है जिसमें मौजूदा फाइलें हैं। इस निर्देशिका में मैं दौड़ता हूं git init, और फिर उसके ठीक बाद git reset --hard। शुरू करने के लिए कोई रिफ्लॉग या कोई लॉग भी नहीं है। इन फ़ाइलों को अब बहुत टोस्ट कर रहे हैं?
एलन जूल

@AlanSE, दुख की बात है कि वे फाइलें टोस्ट हैं, जहां तक ​​मुझे जानकारी है। यदि आपने कभी ऐसा नहीं किया है git add(यानी फ़ाइल के उस संस्करण का कभी भी मंचन नहीं किया है), git checkoutया फिर git reset --hardबिना बैकअप के ही कॉपी (वर्किंग डायरेक्टरी) को उड़ा देगा। काश ऐसा नहीं होता।
मार्क लोडेटो जूल

2
git reset HEAD~12उफ़ ... git reset HEAD@{12}nooo .. बचाव के लिए 'git reflog'! ओह, यह सिर्फ हैgit reset HEAD@{1}
डेनिस

उत्कृष्ट git-scm.com/blog/2011/07/11/reset.html git-reset लेख पढ़ने के बाद , मैं थोड़ा कम रहस्यमय हूँ।
एंड्री Drozdyuk

192

पुराना प्रश्न, और पोस्ट किए गए उत्तर बहुत अच्छे हैं। मैं हालांकि एक और विकल्प के साथ झंकार करूँगा।

git reset ORIG_HEAD

ORIG_HEADसंदर्भ के लिए प्रतिबद्ध है कि HEADपहले से संदर्भित।


1
यह बहुत अच्छा लगता है - क्या आप विस्तृत कर पाएंगे? क्या "मूल" यहाँ "मूल" के लिए छोटा है या "मूल" के लिए? ... यानी, क्या यह उसके साथ बंदर शुरू करने से पहले HEAD को रीसेट कर देता है? या जहां उत्पत्ति पर HEAD है? इससे पहले कि आप कई बार HEAD स्थानांतरित कर चुके हैं तो क्या होगा git reset ORIG_HEAD? धन्यवाद।
बेंजॉन

ORIG का अर्थ है मूल, ORIG_HEAD का अर्थ है मूल HEAD, रीसेट से पहले
सैम गैलाघर

"कुछ ऑपरेशन, जैसे मर्ज और रीसेट, HEIG के पिछले संस्करण को ORIG_HEAD में रिकॉर्ड करते हैं, इसे नए मूल्य पर समायोजित करने से पहले। आप ORIG_HEAD का उपयोग पिछली स्थिति को पुनर्प्राप्त करने या वापस करने या तुलना करने के लिए कर सकते हैं।" पुस्तक का अंश: "संस्करण नियंत्रण गिट के साथ"
अमीर्रेज़ा

56

मेरी स्थिति थोड़ी अलग थी, मैंने git reset HEAD~तीन बार किया।

इसे करने के लिए मुझे यह करना पड़ा

git reset HEAD@{3}

तो आप करने में सक्षम होना चाहिए

git reset HEAD@{N}

लेकिन अगर आपने git reset का इस्तेमाल किया है

git reset HEAD~3

आपको करने की आवश्यकता होगी

git reset HEAD@{1}

जैसा कि {N} Reflog में परिचालनों की संख्या को दर्शाता है। जैसा कि मार्क ने टिप्पणियों में बताया है।


2
स्वीकृत विकल्प आगे जाने का उदाहरण प्रदान नहीं करता है NI एक घंटे पहले एक ऐसी स्थिति में था जहां मैं 1. से अधिक आगे बढ़ना चाहता था। कई के साथ कोशिश की और यह काम किया। यहां जोड़ना चाहते थे। जीआईटी रीसेट के साथ पूर्ववत रीसेट की तलाश कर रहे लोगों के लिए उपयोगी होगा HEAD ~ 3
zainengineer

3
लेकिन अगर किसी ने git रीसेट HEAD ~ 3 किया है तो वह जल्दी से इसे पूर्ववत करने का तरीका देख सकता है, git रीसेट HEAD @ {3} को रीफ़्लॉग git रीसेट में जाने के बिना आवश्यक है ~ 3 आदि एक सामान्य स्थिति है
zainenger

1
मुझे लगता है कि {1} / {2} को देखकर किसी को भी एहसास होगा कि संख्या कोई भी संशोधन संख्या हो सकती है, जिसे reflogकमांड आपको प्रदान करता है। सहमत हैं कि संख्या ~ 3 / @ {3} के लिए समान होने के बारे में आपकी बात लेकिन वास्तव में एक नए उत्तर की आवश्यकता नहीं थी।
क्लिंट

30

1. git reflogसभी संदर्भ अद्यतन प्राप्त करने के लिए उपयोग करें।

2।git reset <id_of_commit_to_which_you_want_restore>

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