मेरे Git रेपो ने एक अलग राज्य में प्रवेश क्यों किया?


386

मैं आज एक अलग सिर के साथ समाप्त हो गया, एक ही समस्या के रूप में वर्णित है: git धक्का कहते हैं कि सब कुछ अप-टू-डेट है, भले ही स्थानीय परिवर्तन हों

जहां तक ​​मुझे पता है कि मैंने कुछ भी सामान्य से बाहर नहीं किया, बस अपने स्थानीय रेपो से कमिट करता हूं और धक्का देता हूं।

तो मैं एक के साथ कैसे समाप्त हुआ detached HEAD?


18
एक दूरस्थ शाखा की जाँच करना ऐसा लगता है जैसे गलती से ऐसा करना सबसे आम तरीका है; एक और सामान्य तरीका यह है कि branch-name@{n}, nth के पिछले स्थान की जाँच करें branch-name। लेकिन कोई बात नहीं, कुछ बिंदु पर एक होना चाहिए था git checkout <rev>। यदि वह घंटी नहीं बजाता है, तो संभवतः आपने वही किया होगा जिसका उल्लेख किया है - करने की कोशिश की git checkout <file>और दुर्घटना से संशोधन निर्दिष्ट करने में कामयाब रहे।
कैस्केबेल

3
एक अलग हेड राज्य को पूर्ववत करने के लिए, फिक्स एक गिट अलग सिर देखें?

रेपो के दौरान संघर्षों का सामना करने पर मेरा रेपो इस राज्य में समाप्त हो गया। सौभाग्य से गित ने मुझे बताया कि जब मैं चला तो क्या करना चाहिए git status:all conflicts fixed: run "git rebase --continue"
पॉल

2
यदि आप गलती git checkout remotes/origin/my-branchसे git checkout my-branchया के बजाय टाइप करते हैं तो भी होता है git checkout origin/my-branch
एडम लीबुसा

@ आदम लिबुसा, धन्यवाद यह मेरे लिए काम किया। Git checkout remotes / origin / my-branch और git चेकआउट माय-ब्रांच में क्या अंतर है। क्या यह वही नहीं है। लेकिन तुमने जो कहा वह मेरे लिए काम कर गया। जिज्ञासा से मैं पूछ रहा हूं।
करुणाकर भोगारी १ar

जवाबों:


280

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

एक अलग सिर के साथ प्रतिबद्ध देखें

जब हेड को अलग किया जाता है, तो सामान्य की तरह काम करता है, इसके अलावा कोई नामित शाखा अपडेट नहीं होती है। (आप इसे एक अनाम शाखा के रूप में सोच सकते हैं।)

वैकल्पिक शब्द

उदाहरण के लिए, यदि आप किसी "रिमोट ब्रांच" को पहले ट्रैक किए बिना चेकआउट करते हैं, तो आप अलग किए गए HEAD के साथ समाप्त हो सकते हैं।

गिट देखें : सिर को अलग किए बिना स्विच शाखा


Git 2.23 (अगस्त 2019) के साथ, आपको भ्रमित करने वाली git checkoutकमांड का उपयोग करने की आवश्यकता नहीं है ।

git switch इसके अलावा एक शाखा की जाँच कर सकते हैं, और एक अलग सिर प्राप्त कर सकते हैं:

  • इसका एक स्पष्ट --detachविकल्प है

HEAD~3नई शाखा बनाए बिना अस्थायी निरीक्षण या प्रयोग के लिए प्रतिबद्ध होने की जाँच करने के लिए:

git switch --detach HEAD~3
HEAD is now at 9fc9555312 Merge branch 'cc/shared-index-permbits'
  • यह एक दूरस्थ ट्रैकिंग शाखा की गलती से अलग नहीं हो सकता

देख:

C:\Users\vonc\arepo>git checkout origin/master
Note: switching to 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

बनाम नई git switchकमांड का उपयोग करना :

C:\Users\vonc\arepo>git switch origin/master
fatal: a branch is expected, got remote branch 'origin/master'

यदि आप दूरस्थ शाखा पर नज़र रखने वाली एक नई स्थानीय शाखा बनाना चाहते हैं:

git switch <branch> 

यदि <branch>नहीं पाया जाता है, लेकिन <remote>एक मिलान नाम के साथ ठीक एक रिमोट (इसे कॉल करें ) में एक ट्रैकिंग शाखा मौजूद है , तो इसके बराबर माना जाता है

git switch -c <branch> --track <remote>/<branch>

और कोई गलती नहीं!
और अधिक अवांछित अलग नहीं!


12
एक और तरीका है कि आप अलग-थलग सिर राज्य में प्रवेश कर सकते हैं यदि आप एक इंटरैक्टिव विद्रोह के बीच में हैं, और आप कमिट्स में से एक को संपादित करना चाहते हैं। जब Git आपको संपादित करने के लिए प्रतिबद्ध करता है, तो आप तब तक एक अलग स्थिति में रहेंगे जब तक आप छूट समाप्त नहीं कर देते।

इस दृश्य मार्गदर्शिका में, यह व्याख्या है: git commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage."फ़ाइलों को मंच पर कॉपी किया जाता है" से इसका क्या मतलब है? मुझे लगा कि फाइलें प्रतिबद्ध हैं, जिसका मतलब है कि मंच साफ हो गया है?
अधिकतम

16
वास्तव में, जब भी आप इसकी SHA1 द्वारा किसी भी कमेटी को चेकआउट करेंगे, तो आपको एक अलग हेड मिलेगा, चाहे वह किसी शाखा की नोक पर हो या न हो; केवल एक प्रकार की चीज जिसे आप अलग कर सकते हैं बिना एक अलग हेडएड एक शाखा का नाम है। उदाहरण के लिए, भले ही masterपर है ed489ऊपर चित्र पर, git checkout ed489आपके पास अलग HEAD, जबकि दे देंगे git checkout masterनहीं होगा।
मुसीफिल

8
"You can think of this as an anonymous branch":) मुझे सादृश्य पसंद है
एड्रियन बन


117

मैंने इसे अभी दुर्घटना द्वारा पुन: प्रस्तुत किया:

  1. दूरस्थ शाखाओं को सूचीबद्ध करता है

    git branch -r
          origin/Feature/f1234
          origin/master
    
  2. मैं स्थानीय रूप से एक चेकआउट करना चाहता हूं, इसलिए मैंने पेस्ट को काट दिया:

    git checkout origin/Feature/f1234
    
  3. Presto! अलग राज्य

    You are in 'detached HEAD' state. [...])
    

समाधान # 1:

origin/इसे जाँचते समय मेरी शाखा युक्ति के सामने शामिल न करें :

git checkout Feature/f1234

समाधान # 2:

-bपैरामीटर जोड़ें जो रिमोट से एक स्थानीय शाखा बनाता है

git checkout -b origin/Feature/f1234 या

git checkout -b Feature/f1234 यह अपने आप मूल में वापस आ जाएगा


14
यह लगभग एक महान जवाब है, लेकिन यह बताने में विफल रहता है कि आप अलग राज्य में क्यों आए।
हंस

5
मैं सहमत हूं लेकिन यह उस समाधान को प्रदान करता है जिसकी मुझे तलाश थी। धन्यवाद!!
किलामेजिंग

मैंने इस अन्य उत्तर में देखा कि git checkout -b Feature/f1234<=> git branch Feature/f1234और git checkout Feature/f1234
आयुध

1
डिफ़ॉल्ट रूप से यह मूल में दिखता है, इसलिए जब आप देते हैं origin/branchname, तो यह origin/origin/branchnameबताना चाहता है कि पहले एक दूरस्थ नाम है जिसका आप उपयोग करते हैं -b, यदि आप इसे anonymousशाखा नहीं बनाते हैं जो अलग है। इसी तरह एक अलग रिमोट से जांच करने के लिए आपको -bपैरामीटर का उल्लेख करना होगा अन्यथा गिट के पास यह जानने का कोई तरीका नहीं है कि यह एक नए रिमोट से है, यह खोज करेगा origin/remote/branchname
garg10may

आप संत हैं!
हार्वे लिन

12

प्रयत्न

git reflog 

यह आपको बताता है कि अतीत में स्थानांतरित किए गए आपके HEAD और शाखा पॉइंटर्स कैसे हैं।

जैसे:

88ea06b HEAD @ {0}: चेकआउट: विकास से हटकर / रिमार्स / ओरिजिन / SomeNiceFeature e47bf80 HEAD @ {1}: मूल उद्गम खींचो: तेजी से आगे

इस सूची के शीर्ष पर एक पुनर्मिलन हो सकता है जो एक डीटैक्ड हेड राज्य का सामना कर सकता है ... एक दूरस्थ ट्रैकिंग शाखा की जाँच कर रहा है।


7

यह आसानी से हो सकता है यदि आप उन परिवर्तनों को पूर्ववत करने का प्रयास करते हैं जो आपने फ़ाइलों की पुनः जाँच करके किए हैं और वाक्यविन्यास सही नहीं मिल रहे हैं।

आप के आउटपुट को git logदेख सकते हैं - आप अंतिम सफल कमिटमेंट के बाद से यहां लॉग की पूंछ को चिपका सकते हैं, और हम सब देख सकते हैं कि आपने क्या किया। या आप इसे पेस्ट कर सकते हैं और #gitफ़्रीनोड आईआरसी पर अच्छी तरह से पूछ सकते हैं ।


5

ऐसा हो सकता है यदि आपके पास एक शाखा के समान एक टैग है।

उदाहरण: यदि "रिलीज़ / 0.1" टैग नाम है, तो

git checkout release/0.1

"रिलीज़ / 0.1" पर अलग एचएएडी का उत्पादन करता है। यदि आप एक शाखा का नाम जारी करने की उम्मीद करते हैं, तो आप भ्रमित हो जाते हैं।


1
हाँ। लेकिन आप इसे कैसे ठीक करेंगे? आप शाखा का चेकआउट कैसे करते हैं?
मार्टिन

5

Detached HEAD इसका मतलब है कि वर्तमान में जो चेक आउट किया गया है, वह स्थानीय शाखा नहीं है।

कुछ परिदृश्य जो एक Detached HEADराज्य में परिणाम होंगे :

  • यदि आप एक दूरस्थ शाखा की जांच करते हैं , तो कहें origin/master। यह केवल पढ़ने वाली शाखा है। इस प्रकार, जब एक कमेटी बनाई जाती है origin/masterतो वह फ्री-फ्लोटिंग होगी , यानी किसी भी शाखा से नहीं जुड़ी होगी।

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

    जब आप वापस जाना चाहते हैं और वहां से काम शुरू करने के लिए एक विशिष्ट कमिट या टैग चेकआउट करते हैं, तो आप उस कमिट से उत्पन्न एक नई शाखा बना सकते हैं और इसके द्वारा स्विच कर सकते हैं git checkout -b new_branch_name। यह Detached HEADराज्य को रोक देगा क्योंकि अब आपके पास एक शाखा है जो एक चेक आउट है और एक प्रतिबद्ध नहीं है।


3

एक सरल आकस्मिक तरीका git checkout headएक टाइपो के रूप में करना है HEAD

इसे इस्तेमाल करे:

git init
touch Readme.md
git add Readme.md
git commit
git checkout head

जो देता है

Note: checking out 'head'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 9354043... Readme

इसके अलावा longair.net/blog/2012/05/07/the-most-confusing-git-terminology ("" हेड "और" हेड "के लिए देखो) में उल्लेख किया गया है
VONC

@VonC: उस लिंक के लिए धन्यवाद। मैं एक Git प्रशिक्षण की तैयारी कर रहा हूं और मैं यह भी बताना चाहता हूं कि यह कभी-कभी इतना भ्रामक क्यों होता है। मेरे पास पहले से ही बहुत सारे उदाहरण हैं (जैसे checkout -bकि एक चेकआउट की तरह दिखता है, लेकिन वास्तव में शाखाएं) लेकिन एक और सूची बस स्वागत योग्य है।
थॉमस वेलर

2

एक अलग शाखा में जाने के लिए दूसरा रास्ता एक सुदूर शाखा के लिए प्रतिबद्ध होने का प्रयास करना है। कुछ इस तरह:

git fetch
git checkout origin/foo
vi bar
git commit -a -m 'changed bar'

ध्यान दें कि यदि आप ऐसा करते हैं, तो चेकआउट उत्पत्ति / फू को आगे बढ़ाने का कोई भी प्रयास आपको वापस अलग राज्य में छोड़ देगा!

इसका समाधान अपनी स्वयं की स्थानीय फू शाखा बनाना है जो मूल / फू को ट्रैक करता है, फिर वैकल्पिक रूप से धक्का देता है।

इसका संभवतः आपकी मूल समस्या से कोई लेना-देना नहीं है, लेकिन यह पृष्ठ "हिट डिटैक्ड हेड" के लिए Google हिट्स पर उच्च है और यह परिदृश्य गंभीर रूप से अंडर-डॉक्यूमेंटेड है।


यह स्थिति प्रतीत होती है कि ओवेन के ऊपर दिए गए जवाबों के बारे में बात करता है - जहां "मूल / फू" को काटना और चिपकाना इसे "मूल / मूल / फू" के रूप में सोचते हैं।
मेवलीन

1

जब आप किसी कमेटी git checkout <commit-hash>या किसी सुदूर शाखा में चेकआउट करते हैं तो आपका HEAD अलग हो जाएगा और उस पर एक नई कमिट बनाने का प्रयास करेगा।

किसी भी शाखा या टैग द्वारा उपलब्ध नहीं होने वाले कमानों को 30 दिनों के बाद भंडार से एकत्र और हटा दिया जाएगा।

इसे हल करने का दूसरा तरीका यह है कि नई बनाई गई कमेटी के लिए एक नई शाखा बनाकर उसे चेकआउट किया जाए। git checkout -b <branch-name> <commit-hash>

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

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