2010-03-23 15 views
67

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

मुझे यह समझ में नहीं आया, ऐसा क्यों हुआ? और हमारे परिवर्तनों को खोए बिना इसमें कैसे निकलते हैं?

उत्तर

87

"वर्तमान में किसी भी शाखा पर नहीं" का अर्थ है कि आपके पास detachedhead है, यानी आपका हेड पॉइंटर सीधे शाखा के नाम पर प्रतीकात्मक रूप से इंगित करने के बजाय प्रतिबद्धता का संदर्भ दे रहा है।

आप SHA1 द्वारा प्रतिबद्धता की जांच करके या जब आप किसी रिबेस के बीच में हों, या जब विलय विफल हो जाए, तो आप इस स्थिति में शामिल हो सकते हैं। यह कहना मुश्किल है कि दुर्घटना से इस स्थिति में आने के लिए आपने क्या किया होगा।

ऐसा कहा जाता है कि जब आप एक अलग सिर से कुछ शाखा में स्विच करते हैं तो आप अपने परिवर्तन खो सकते हैं, लेकिन रीफ्लॉग हमेशा आपके सिर को स्थानांतरित करने का ट्रैक रखेगा। असल में, एक अलग सिर से स्विच करते समय गिट 1.7.5 आपको चेतावनी देगा। एकमात्र बार आप वास्तव में काम खो सकते हैं जब आपके पास असामान्य परिवर्तन होते हैं, जिन्हें आप प्रतिबद्ध या छेड़छाड़ करना चाहते हैं।

क्या हुआ यह देखने का एक आसान तरीका git reflog या git log -g --decorate अधिक वर्बोज़ सूची के लिए है। --decorate विकल्प प्रत्येक SHA1 को उन सभी शाखाओं के नाम से लेबल करेगा जो उस पर इंगित करते हैं। यदि आपके वर्तमान हेड का SHA1 मास्टर के समान ही है, तो आपको ट्रैक पर वापस आने के लिए git checkout master पर कुछ भी करने की ज़रूरत नहीं है। अन्यथा, देखें कि SHA1 को किसी अन्य शाखा द्वारा इंगित किया गया है या नहीं। यदि नहीं, तो आप इसे लटकने के लिए एक शाखा बनाना चाह सकते हैं।

एक और अच्छा आदेश git branch -av है, जो समान रूप से सभी शाखाओं को सूचीबद्ध करेगा और वे क्या इंगित करेंगे, ताकि आप देख सकें कि आपका (no branch) वास्तव में क्या होना चाहिए।

+0

+1। इससे मुझे पता चला कि यह क्या गड़बड़ है। – kakyo

30

अधिक जानकारी के बिना बताना मुश्किल है।

git pull रिमोट रिपोजिटरी से परिवर्तन लाता है और फिर विलय करता है। इसे मर्ज के बजाए रीबेज करने के लिए कॉन्फ़िगर किया जा सकता है (या तो git pull --rebase करके, या जिस शाखा में आप खींच रहे हैं उसके लिए branch.<branch_name>.rebase के लिए सही मान कॉन्फ़िगर करके)।

यदि आप किसी शाखा पर शुरू करते हैं, तो कोई मर्ज-टाइप पुल हमेशा आपको उस शाखा पर छोड़ देगा। दूसरी तरफ, रीबेस कमांड हमेशा एक अस्थायी रूप से अलग सिर (उर्फ "नो शाखा") का उपयोग करके काम करता है। यदि आपको रीबेस-टाइप पुल के दौरान इस स्थिति में छोड़ा गया था, तो ऐसा इसलिए होता है क्योंकि पुल के रिबेस हिस्से में संघर्ष का सामना करना पड़ता है और यह आपके लिए उन्हें हल करने और rebase --continue (या --skip, या --abort) का उपयोग करने का इंतजार कर रहा है।

डिफ़ॉल्ट रूप से, रीफ्लॉग हेड में किए गए प्रत्येक अपडेट को स्टोर करता है (प्रत्येक शाखा के लिए भी एक हो सकता है)। आप अधिक वर्बोज दृश्य के लिए git reflog show (या git log -g) के साथ रीफ्लॉग देख सकते हैं। यह आपको यह निर्धारित करने में मदद कर सकता है कि आप इस राज्य में कैसे पहुंचे।

यदि आप किसी रिबेस के बीच में हैं (आपके पास .git/rebase-apply निर्देशिका है), तो शायद यह आपको कुछ संघर्षों को हल करने के लिए बंद कर दिया है। "Unmerged" प्रविष्टियों की जांच के लिए git status का उपयोग करें। ऐसी किसी भी प्रविष्टि में फाइलों में एम्बेडेड विवाद चिह्न होना चाहिए (मानते हैं कि वे सादा पाठ फाइलें हैं)। आपको संघर्षों को हल करने के लिए उन्हें संपादित करना चाहिए और उन्हें git add चलाकर उन्हें विलय के रूप में चिह्नित करें। फिर रीबेस के साथ जारी रखने के लिए git rebase --continue चलाएं। आप अधिक संघर्षों में भाग ले सकते हैं जिन्हें समान तरीके से संभाला जाना चाहिए (संपादित करें, जोड़ें, जारी रखें)। यदि आप तय करते हैं कि अब आपको किसी विशेष प्रतिबद्धता की आवश्यकता नहीं है, तो आप इसे git rebase --skip से छोड़ सकते हैं।आप पूरे रीबेस को git rebase --abort से रोक सकते हैं। इन सभी रीबेस आदेशों को त्रुटि संदेश में सूचीबद्ध किया जाता है जब कोई विवाद किसी भी संघर्ष के कारण बंद हो जाता है। एक बार सभी लंबित प्रतिबद्धताओं को लागू किया गया है (या छोड़ा गया), आपकी मूल शाखा अंतिम नई प्रतिबद्धता के साथ अपडेट की जाएगी और आपके सिर को इसके साथ दोबारा जोड़ा जाएगा (यदि आप निरस्त करते हैं, तो आपके सिर को शाखा अपडेट किए बिना दोबारा जोड़ा जाएगा)।

यदि आपका अलग सिर एक रिबेस के बीच में किए गए संघर्षों के कारण नहीं है, तो आपके सिर को खींचने से पहले किसी बिंदु पर अलग किया गया था। आप क्या करना चाहते हैं यह तय करने के लिए आपको पेड़ की वर्तमान स्थिति का मूल्यांकन करने की आवश्यकता होगी। आप git show-branch --current --all या git log --graph --oneline --decorate --all या gitk जैसे ग्राफ़िकल टूल का उपयोग करके पता लगा सकते हैं कि आपका वर्तमान (अलग) हेड आपकी अन्य शाखाओं से कैसे संबंधित है। यदि आप तय करते हैं कि आप अपने सिर की सामग्री रखना चाहते हैं, तो आप git branch new_branch_name के साथ उनके लिए एक नई शाखा बना सकते हैं। यदि आप किसी मौजूदा शाखा को ओवरराइट करना चाहते हैं, तो git branch --force existing_branch_name का उपयोग करें। फिर अपने भंडार के सिर को शाखा में दोबारा जोड़ने के लिए git checkout branch_name का उपयोग करें।

+1

'गिट/रीबेस-लागू' की उपस्थिति के बारे में अच्छी जानकारी एक सुराग है। – millhouse

1

ध्यान दें कि, एक "git pull --rebase" रन जबकि HEAD अलग है के मामले में, Git अलग HEAD (जो परिभाषा से मौजूद नहीं है) और उत्सर्जित अनावश्यक त्रुटि संदेशों में से नदी के ऊपर शाखा को खोजने की कोशिश की।

यह नहीं रह गया है Git1.8.0.1 (26 वें नवंबर 2012) के मामले में

this commit देखें है। गिट रिफ्लॉग के लिए

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