मैं HEAD को पिछले स्थान पर वापस कैसे ले जा सकता हूं? (अलग किया गया सिर) और पूर्ववत करता है


179

Git में, मैं squash commitकिसी अन्य शाखा में विलय करके और फिर HEADपिछली जगह पर जाकर रीसेट करने की कोशिश कर रहा था :

git reset origin/master

लेकिन मुझे इससे बाहर निकलने की जरूरत है। मैं HEAD को पिछले स्थान पर वापस कैसे ले जा सकता हूं?

मेरे पास SHA-1 टुकड़ा ( 23b6772) है जो मुझे इसे स्थानांतरित करने की आवश्यकता है। मैं इस कमिट पर वापस कैसे जा सकता हूं?


12
HEAD आपके वर्तमान स्थान के लिए एक संकेतक है (या सटीक होने के लिए संशोधन)। git checkout 23b6772करना चाहिए।
यारोस्लाव एडमिन 21


1
@YaroslavAdmin नहीं यह नहीं होना चाहिए । सीधे एक कमेटी की जाँच करना ही वह कारण है जिसे अलग किया गया है हेड स्टेट टिप्पणी :-) मुझे उम्मीद है कि प्रारंभिक समस्या पहले से ही हल हो गई है ...
रोमेनवेलरी

जवाबों:


398

जवाब देने से पहले, आइए कुछ पृष्ठभूमि जोड़ें, जिसमें बताया गया है कि यह क्या HEADहै।

First of all what is HEAD?

HEADबस वर्तमान शाखा पर वर्तमान प्रतिबद्ध (नवीनतम) के लिए एक संदर्भ है। किसी भी समय
केवल एक ही हो सकता है HEAD(छोड़कर git worktree)।

की सामग्री HEADअंदर संग्रहित है .git/HEADऔर इसमें वर्तमान बाइट के 40 बाइट्स SHA-1 हैं।


detached HEAD

यदि आप नवीनतम कमिट पर नहीं हैं - इसका मतलब है कि HEADइतिहास में एक पूर्व कमिट की ओर इशारा किया जाता है detached HEAD

यहां छवि विवरण दर्ज करें

कमांड लाइन पर, यह इस तरह दिखाई देगा - SHA-1 शाखा के नाम के बजाय चूंकि HEADवर्तमान शाखा की नोक की ओर इशारा नहीं है:

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें


एक अलग सिर से उबरने के बारे में कुछ विकल्प:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

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

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

आप हमेशा के reflogरूप में अच्छी तरह से उपयोग कर सकते हैं ।
git reflog किसी भी परिवर्तन को प्रदर्शित करेगा जो अपडेट किया गया था HEADऔर वांछित रिफ्लग प्रविष्टि की जांच करके इस कमेटी को HEADवापस सेट कर देगा ।

हर बार जब संशोधित किया जाता है तो एक नई प्रविष्टि होगी reflog

git reflog
git checkout HEAD@{...}

यह आपको आपकी इच्छित कमिट पर वापस मिल जाएगा

यहां छवि विवरण दर्ज करें


git reset --hard <commit_id>

"HEAD" को अपने HEAD में इच्छित स्थान पर वापस ले जाएं।

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.

git revert <sha-1>

दी गई प्रतिबद्ध या प्रतिबद्ध सीमा को "पूर्ववत करें"।
रीसेट कमांड दिए गए कमिट में किए गए किसी भी बदलाव को "पूर्ववत" करेगा।
पूर्ववत पैच के साथ एक नई प्रतिबद्धता होगी, जबकि मूल प्रतिबद्धता इतिहास में भी रहेगी।

# Add a new commit with the undo of the original one.
# The <sha-1> can be any commit(s) or commit range
git revert <sha-1>

यह स्कीमा दिखाता है कि कौन सी कमांड क्या करती है।
जैसा कि आप वहां देख सकते हैं, reset && checkoutसंशोधित करें HEAD

यहां छवि विवरण दर्ज करें


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

आप अलग-अलग HEAD में हो सकते हैं और एक ही समय में इस शाखा के HEAD के साथ एक ही प्रतिबद्ध हो सकते हैं। मुझे आपकी टिप्पणी समझ में नहीं आ रही है
CodeWizard

3
मैं शीर्षकों के लिए इनलाइन-कोड मार्कअप के आपके उपयोग के साथ समस्याएँ
रखता हूं

इस पर जोर देने का कोई बेहतर तरीका नहीं मिल सका। बेझिझक संपादित करें। आपका स्वागत है
CodeWizard

22

करना

git reset 23b6772

यह देखने के लिए कि क्या आप सही स्थिति पर हैं:

git status

आप कुछ देखेंगे

शाखा मास्टर पर 17 शाखा द्वारा आपकी शाखा 'मूल / मास्टर' के पीछे है, और इसे तेजी से अग्रेषित किया जा सकता है।

फिर परिवर्तन को प्रतिबिंबित करने के लिए अपने रिमोट पर इतिहास को फिर से लिखें:

git push --force-with-lease // a useful command @oktober mentions in comments

1
इसके साथ विशेष रूप से सतर्क रहें git push --force। कई स्थितियों में यह आपको थोड़ी देर के लिए टीम का सबसे कम लोकप्रिय व्यक्ति बना देगा ....
काय वी

उपरोक्त नोट में जोड़ने के लिए, मैं अभी इस उद्धरण के बारे में आया। itlab.com/.com/loglog/11/11/26/keeping-your-code-protected पर और इसे जोड़ना था: "एक एकल धक्का धक्का - प्रवर्तन कमान बहुत से लोगों के लिए आसानी से दिन बर्बाद कर सकते हैं: [१en६ जेनकींस] रिपॉजिटरी में उनके शाखा प्रमुख पुराने कमिट्स की ओर इशारा करते हैं, और वास्तव में नए कमिट्स खराब गिट-पुश के बाद गलत तरीके से हटा दिए गए थे। " - हर अलोकप्रिय डेवलपर ....
Kay V

2
@KayV पर एक नज़र डालें git push --force-with-lease: (Thoughtbot लेख thoughtbot.com/blog/git-push-force-with-lease )
अक्टूबर

1
उपयोगी झंडा, @oktober, और एक अच्छा लेख। इसे यहाँ जोड़ने और मुझे इसके बारे में बताने के लिए धन्यवाद।
काय वी

1
धन्यवाद! इससे मुझे एक मर्ज करने में मदद मिली। चूंकि विलय एक ही तरह से प्रतिक्रिया नहीं revertकरता है जैसा कि मैं करता हूं कि मैंने खुद को अविश्वसनीय रूप से कठिन स्थिति में पाया। force-with-leaseमुझे अन्य लोगों के काम को प्रभावित किए बिना शाखा के गिट इतिहास को फिर से लिखने का विश्वास दिया। वाहवाही!
आनन ५58१

11

सबसे तेज संभव समाधान (सिर्फ 1 कदम)

उपयोग git checkout -

आप देखेंगे Switched to branch <branch_name>। पुष्टि करें कि यह वह शाखा है जो आप चाहते हैं।


संक्षिप्त विवरण: यह कमांड HEAD को उसकी अंतिम स्थिति में वापस ले जाएगा। इस उत्तर के अंत में परिणाम देखें ।


Mnemonic: यह दृष्टिकोण cd -आपके पहले देखी गई निर्देशिका पर लौटने के लिए उपयोग करने जैसा है । सिंटैक्स और लागू मामले एक बहुत अच्छा मैच हैं (जैसे कि यह तब उपयोगी होता है जब आप वास्तव में चाहते हैं कि एचआईएडी जहां वापस लौटा था)।


अधिक व्यवस्थित समाधान (2-चरण, लेकिन यादगार)

त्वरित दृष्टिकोण ओपी के प्रश्न को हल करता है। लेकिन क्या होगा अगर आपकी स्थिति थोड़ी अलग है: मान लीजिए कि आपने बैश को फिर से शुरू कर दिया है, तो अपने आप को HEAD से अलग पाया। उस स्थिति में, यहां 2 सरल, आसानी से याद किए गए चरण हैं।

1. आपको जिस शाखा की आवश्यकता है, उसे चुनें

उपयोग git branch -v

आप मौजूदा स्थानीय शाखाओं की सूची देखते हैं। अपनी आवश्यकताओं के अनुरूप शाखा का नाम लें।

2. इसमें HEAD को मूव करें

उपयोग git checkout <branch_name>

आप देखेंगे Switched to branch <branch_name>। सफलता!


परिणाम

किसी भी विधि के साथ, अब आप अपने काम को पहले की तरह जोड़ना और करना जारी रख सकते हैं: आपके अगले परिवर्तनों पर नज़र रखी जाएगी <branch_name>

ध्यान दें कि दोनों git checkout -और git checkout <branch_name>अतिरिक्त निर्देश देंगे यदि आपने बदलाव किया है जबकि HEAD को अलग कर दिया गया था।


यह काम नहीं कर रहा है, तो मुझे क्या करना है क्योंकि (यह मानते हुए 8acc968 है कि सिर ~ 2) git checkout 8acc968तो git branch -vहै MyBranchनीचे ... सूची में है, लेकिन फिर git checkout MyBranchमेरी टिप्पणी हटा देता है।
अमूलर

हाय @amuliar - git checkout 8acc968एक कमिट की जाँच करेगा, एक शाखा की नहीं। यदि MyBranchआप चाहते हैं, तो प्रयास करें git checkout MyBranch। यदि इसमें 8acc968 प्रतिबद्ध परिवर्तन नहीं हैं, तो आपको शाखा की जाँच के बाद उन परिवर्तनों को मर्ज करना होगा।
काय वी

जवाब के लिए धन्यवाद! मैंने git checkoutपिछली कमिटमेंट को देखा और नवीनतम कमेटी में वापस जाना चाहता था। लेकिन नवीनतम प्रतिबद्ध हैश के बिना, मैं बहुत ज्यादा खो गया था। यह समाधान मेरी स्थिति के लिए एकदम सही है!
zyy

4

प्रश्न को इस प्रकार पढ़ा जा सकता है:

मैं अलग-अलग स्थिति में HEADथा 23b6772और टाइप किया हुआ था git reset origin/master(क्योंकि मैं स्क्वैश करना चाहता था)। अब मैंने अपना इरादा बदल दिया है, मैं कैसे के लिए वापस जाना है HEADपर किया जा रहा है 23b6772?

सीधा जवाब है: git reset 23b6772

लेकिन मैंने इस सवाल को टाल दिया क्योंकि मैं टाइपिंग (कॉपी और पेस्टिंग) कमिट हैश या इसके संक्षिप्त नाम से बीमार हो गया था, हर बार जब मैं पिछले का संदर्भ लेना चाहता HEADथा और यह देखने के लिए गया था कि क्या किसी तरह का शॉर्टहैंड है।

यह पता चला है कि वहाँ है!

git reset -(या मेरे मामले में git cherry-pick -)

संयोग से वही cd -स्थिति थी जो पिछली वर्तमान निर्देशिका * निक्स में वापस आ गई थी ! तो तूफान, मैंने एक पत्थर से दो चीजें सीखीं।


0

जब आप कमांड चलाते हैं git checkout commit_idतो HEAD से अलग हो जाता है 13ca5593d(say commit-id)और शाखा लंबे समय तक उपलब्ध रहेगी।

पिछले स्थान पर वापस जाएँ चरण कमांड चलाएं -

  1. git pull origin branch_name (गुरु कहते हैं)
  2. git checkout branch_name
  3. git pull origin branch_name

आप दूरस्थ रिपॉजिटरी से एक अद्यतन प्रतिबद्ध के साथ पिछले स्थान पर वापस आ जाएंगे।


0

आज, मैंने गलती से एक कमिट पर जाँच की और उस पर काम करना शुरू कर दिया, जिससे एक अलग राज्य में कुछ कमिट हो गई। फिर मैंने निम्नलिखित कमांड का उपयोग करके दूरस्थ शाखा को धक्का दिया:

git push origin HEAD: <My-remote-branch>

फिर

git checkout <My-remote-branch>

फिर

git pull

आखिरकार मुझे अपनी शाखा में अपने सभी परिवर्तन मिले जो मैंने एचआईएडी में अलग किए थे।


0

यह एक तकनीकी समाधान नहीं हो सकता है, लेकिन यह काम करता है। (यदि आपकी टीम के किसी साथी की स्थानीय में एक ही शाखा है)

मान लें कि आपकी शाखा का नाम शाखा-xxx है

हल करने के लिए कदम:

  • अपडेट या पुल न करें - कुछ भी नहीं
  • बस एक नई शाखा (बनाने के शाखा-yyy ) से शाखा-xxx उसकी मशीन पर
  • यह सब, आपके सभी मौजूदा परिवर्तन इस नई शाखा ( शाखा-यय ) में होंगे। आप इस शाखा के साथ अपना काम जारी रख सकते हैं।

नोट: फिर से, यह एक तकनीकी समाधान नहीं है, लेकिन यह सुनिश्चित करने में मदद करेगा।

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