2010-10-19 12 views
294

मैं एक अलग सिर के साथ आज एक ही समस्या में वर्णित के रूप समाप्त हो गया,: git push says everything up-to-date even though I have local changesमेरा गिट रेपो एक अलग सिर राज्य क्यों दर्ज किया?

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

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

+11

की जांच कर रहा एक दूरस्थ शाखा लगता है गलती से ऐसा करने का सबसे आम तरीका है; एक और आम तरीका 'शाखा-नाम @ {n} ',' शाखा-नाम 'की पिछली स्थिति की जांच करना है। लेकिन इससे कोई फर्क नहीं पड़ता कि, किसी बिंदु पर क्या होना चाहिए एक गिट चेकआउट '। यदि वह घंटी बजता नहीं है, तो संभवतः आपने जो किया होगा उसका उल्लेख किया - 'गिट चेकआउट ' करने का प्रयास किया और दुर्घटना से संशोधन निर्दिष्ट करने में कामयाब रहा। – Cascabel

+2

एक पृथक हेड स्टेट को पूर्ववत करने के लिए, देखें [एक गिट अलग सिर ठीक करें?] (प्रसाद p: //stackoverflow.com/q/10228760/456814)। –

+0

रिबेजिंग के दौरान संघर्षों का सामना करते समय मेरा रेपो इस स्थिति में समाप्त हुआ। सौभाग्य से गिट ने मुझे बताया कि जब मैं 'गिट स्टेटस' चलाता हूं तो क्या करना है: 'सभी विवाद तय: रन "गिट रिबेस - कंटिन्यूयू" ' – Paul

उत्तर

213

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

committing with a detached HEAD

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

alt text

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

git: switch branch without detaching head

+12

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

+0

इस दृश्य मार्गदर्शिका में, यह स्पष्टीकरण है: 'गिट प्रतिबद्ध फाइलें नवीनतम प्रतिबद्धता की सामग्री वाली एक नई प्रतिबद्धता बनाती हैं, साथ ही कार्यशील निर्देशिका से ली गई फ़ाइलों का एक स्नैपशॉट भी बनाती है। इसके अतिरिक्त, फ़ाइलों को मंच पर कॉपी किया गया है। 'इसका मतलब क्या है "फाइलों को मंच पर कॉपी किया गया है"? मैंने सोचा कि फाइलें प्रतिबद्ध हैं, जिसका मतलब है कि मंच साफ़ हो गया है? – max

+0

@ मैक्स: इस निकास का उल्लेख आप 'गिट प्रतिबद्ध-ए' के ​​लिए है: चरण 'नई * प्रतिबद्ध' के रूप में 'पूर्ण * समान * के रूप में' साफ़ नहीं किया गया है, जिसका अर्थ है कि किसी भी नए संशोधन का पता लगाया जाएगा 'गिट diff', क्योंकि गिट diff सूचकांक के लिए काम कर रहे पेड़ की तुलना करता है। इसलिए यही कारण है कि ['गिट प्रतिबद्ध 'मैन पेज] (http://git-scm.com/docs/git-commit)' -a' विकल्प का वर्णन करता है "कमांड को स्वचालित रूप से संशोधित करने वाली फ़ाइलों को चरणबद्ध करने के लिए कहें और हटा दिया गया है " – VonC

8

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

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

68

मैं दुर्घटना से अभी-अभी इस reproduced:

  1. सूचियों दूरस्थ शाखाओं

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

    git checkout origin/Feature/f1234 
    
  3. प्रेस्टो!पृथक प्रमुख राज्य

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

समाधान # 1:

शामिल न करें अपनी शाखा कल्पना के सामने origin/ जब यह बाहर की जाँच:

git checkout Feature/f1234 

समाधान # 2:

जो रिमोट

git checkout -b origin/Feature/f1234 या

git checkout -b Feature/f1234 से एक स्थानीय शाखा बनाता है इसे वापस मूल करने के लिए गिर जाएगी -b पैरामीटर जोड़ें स्वचालित रूप से

+7

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

+2

मैं सहमत हूं लेकिन यह वह समाधान प्रदान करता है जिसे मैं ढूंढ रहा था। धन्यवाद!! – Kilmazing

+0

मैंने इस [अन्य उत्तर] (https://stackoverflow.com/a/5772882) में देखा है कि 'गिट चेकआउट -बी फ़ीचर/एफ 1234' <=>' गिट शाखा फ़ीचर/एफ 1234' और 'गिट चेकआउट फ़ीचर/एफ 1234'। – Armfoot

7

इस आप एक इतिहास देता है की कोशिश

git reflog 

आपके सिर और शाखा पॉइंटर्स कहां से हैं अतीत में चले गए।

उदा। :

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

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

1

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

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

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

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

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

1

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 
+0

मैं लोअरकेस हेड के बारे में भूल गया। +1। Https://stackoverflow.com/a/4381549/6309 – VonC

+0

https://longair.net/blog/2012/05/07/the-most-confusing-git-terminology/ में भी उल्लेख किया गया है ("HEAD" "और" हेड "") – VonC

+0

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

1

यदि आप एक शाखा के रूप में एक ही नाम के एक टैग है यह भी हो सकता है देता है।

उदाहरण: यदि "रिलीज़/0।1 तो आप भ्रमित हो "टैग नाम है, तो है

git checkout release/0.1 

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

संबंधित मुद्दे