यदि Git HEAD detached दिखाता है, तो आपकी फ़ाइलें अभी भी किसी कमिट पर चेक आउट हैं, लेकिन जब तक आप कोई ब्रांच नहीं बनाते, तब तक नए कमिट किसी ब्रांच को आगे नहीं बढ़ाएंगे। Mac पर, Terminal खोलें, रिपॉजिटरी में जाएं, अनकमिटेड एडिट्स की जांच करें, और फिर या तो अपने वर्तमान काम को एक नई ब्रांच से जोड़ें या सुरक्षित रूप से उस ब्रांच पर वापस लौटें जिसका आप उपयोग करना चाहते थे। Git का switch कमांड दोनों तरीकों का समर्थन करता है। Apple की Terminal गाइड बताती है कि Terminal कैसे खोलें; Git का switch दस्तावेज़ ब्रांच और डिटैच्ड-HEAD व्यवहार को प्रलेखित करता है।
1. जांचें कि Git ने क्या चेक आउट किया है
Applications > Utilities से Terminal खोलें, फिर अपनी रिपॉजिटरी में जाएं। उदाहरण पाथ को उस फ़ोल्डर से बदलें जहाँ आपका प्रोजेक्ट मौजूद है; उद्धरण चिह्नों (quotes) का उपयोग पाथ में स्पेस की अनुमति देता है। macOS Terminal डिफ़ॉल्ट रूप से zsh का उपयोग करता है, और ये कमांड zsh के साथ-साथ सामान्य शेल्स में भी काम करते हैं।
cd "/path/to/your/repository"
git status
यदि git status "HEAD detached" या "not on any branch" कहता है, तो आप डिटैच्ड HEAD स्थिति में हैं। Git ने किसी ब्रांच के बजाय सीधे एक कमिट को चेक आउट किया है। कमिट और वर्किंग फ़ाइलें उपलब्ध रहती हैं; जोखिम यह है कि यहाँ किए गए कमिट अपने आप किसी ब्रांच से नहीं जुड़ते हैं। Git का checkout मैन्युअल इस स्थिति का और यह बताता है कि कोई ब्रांच वहाँ किए गए कमिट्स को कैसे सुरक्षित रख सकती है।
कहीं भी स्विच करने से पहले, शेष git status को पढ़ें। यदि यह संशोधित (modified) या अनट्रैक्ड फ़ाइलों को सूचीबद्ध करता है, तो वे ऐसे बदलाव हैं जो कमिट नहीं किए गए हैं। आप वहीं काम करना जारी रख सकते हैं, या अभी एक ब्रांच बना सकते हैं; वर्तमान कमिट पर ब्रांच बनाने से एडिट्स नष्ट नहीं होते हैं। रिकवर करते समय फ़ोर्स या डिस्कार्ड विकल्पों से बचें।
2. वर्तमान काम को किसी ब्रांच पर रखें
यदि आपने डिटैच्ड रहते हुए कोई कमिट किया है—या आप इसी सटीक स्नैपशॉट से काम जारी रखना चाहते हैं—तो वहीं एक ब्रांच बनाएं जहाँ आप अभी हैं:
git switch -c recovered-work
git status
recovered-work के स्थान पर एक वर्णनात्मक ब्रांच नाम का उपयोग करें। Git वर्तमान कमिट पर ब्रांच बनाता है और उस पर स्विच कर देता है, ताकि बाद के कमिट उस ब्रांच के अंतर्गत आएं। पुष्टि करें कि git status अब ब्रांच का नाम दिखा रहा है। जब डिटैच्ड स्नैपशॉट ही वह काम हो जिसे आप रखना चाहते हैं, तो यह सबसे छोटा रिकवरी मार्ग है। Git दस्तावेज़ switch -c को एक ब्रांच बनाने और उस पर स्विच करने के रूप में वर्णित करता है।
यदि आपके पास अनकमिटेड एडिट्स हैं, तो ब्रांच बनाते समय वे आमतौर पर वर्किंग ट्री में बने रहते हैं। यह सत्यापित करने के लिए कि वे अभी भी मौजूद हैं, बाद में git status की जांच करें। यदि कमांड इस कारण से विफल हो जाता है कि उस नाम की ब्रांच पहले से मौजूद है, तो कोई दूसरा नाम चुनें; -C न जोड़ें, जो किसी मौजूदा ब्रांच को एक नए शुरुआती बिंदु पर रीसेट कर सकता है।
3. उस ब्रांच पर वापस लौटें जिसका आप उपयोग करना चाहते थे
यदि आपने केवल किसी कमिट का निरीक्षण किया था और आपके पास सुरक्षित रखने के लिए कोई बदलाव नहीं है, तो इच्छित ब्रांच पर उसके नाम से स्विच करें। उदाहरण के लिए:
git switch main
यदि आपकी रिपॉजिटरी की ब्रांच का नाम main नहीं है, तो उसके वास्तविक नाम का उपयोग करें। यदि Git रिपोर्ट करता है कि स्थानीय बदलाव ओवरराइट हो जाएंगे, तो रुकें और पहले उन्हें सुरक्षित करें: ऊपर बताए अनुसार एक रिकवरी ब्रांच बनाएं, या काम को कमिट करें। Git आम तौर पर ब्रांच स्विच को तब रोकता है जब इससे स्थानीय संशोधन खोने की संभावना हो; रिकवरी के दौरान --discard-changes से बचें क्योंकि यह इंडेक्स और वर्किंग ट्री को लक्षित ब्रांच से मेल खाने के लिए रीसेट कर देता है। git switch मैन्युअल इन सुरक्षा उपायों और विकल्पों की व्याख्या करता है।
यदि आपने गलती से अभी किसी ब्रांच से स्विच किया है, तो git switch - Git के हालिया स्विच इतिहास द्वारा रिकॉर्ड की गई पिछली ब्रांच या कमिट पर वापस लौटा देता है। आप कहाँ पहुंचे हैं, इसकी पुष्टि करने के लिए स्विच के बाद git status की जांच करें।
4. पहले छोड़े गए डिटैच्ड कमिट को ढूंढें
यदि आप पहले ही स्विच कर चुके हैं और याद नहीं कर पा रहे हैं कि आपका डिटैच्ड कमिट कहाँ गया, तो स्थानीय reflog का निरीक्षण करें:
git reflog
reflog हाल के स्थानीय संदर्भ अपडेट्स को रिकॉर्ड करता है, और HEAD reflog ब्रांच स्विचिंग को भी रिकॉर्ड करता है। ऐसी प्रविष्टि देखें जिसमें आपके काम से मेल खाने वाला कमिट संदेश या समय हो। कुछ भी बदले बिना किसी संभावित कमिट की जांच करने के लिए, reflog से उसका संक्षिप्त कमिट ID कॉपी करें और चलाएं:
git show --stat COMMIT_ID
COMMIT_ID को वास्तविक ID से बदलें—प्लेसहोल्डर को हूबहू टाइप न करें। यदि यह सही कमिट है, तो उस कमिट पर एक ब्रांच बनाकर इसे सुरक्षित रखें:
git switch -c recovered-work COMMIT_ID
यह कमिट को फिर से किसी ब्रांच द्वारा सुलभ बना देता है। Reflogs स्थानीय रिकॉर्ड होते हैं, और प्रविष्टियां समाप्त (expire) हो सकती हैं; Git का दस्तावेज़ीकरण उन्हें हालिया संदर्भ अपडेट्स के रिकॉर्ड के रूप में वर्णित करता है और उनके समाप्त होने के व्यवहार को नोट करता है। देखें git reflog।
5. जारी रखने से पहले सत्यापित करें
वर्तमान ब्रांच और नवीनतम कमिट की पुष्टि करने के लिए git status और git log -1 --oneline चलाएं। यदि आपका काम अनकमिटेड था, तो जांचें कि उसकी फ़ाइलें अभी भी स्टेटस आउटपुट में दिखाई दे रही हैं या नहीं। यदि reflog में कोई संभावित विकल्प नहीं दिखता है, तो रिकवरी के लिए डैंगलिंग ऑब्जेक्ट्स (dangling objects) की जांच करने की आवश्यकता हो सकती है; वह एक अलग, अधिक सावधानीपूर्वक उठाया जाने वाला कदम है, और खोज करते समय आपको git gc जैसे क्लीनअप कमांड चलाने से बचना चाहिए।
डिटैच्ड HEAD का मतलब यह नहीं है कि आपका काम गायब हो गया। सही रिकवरी इस बात पर निर्भर करती है कि आपको वर्तमान कमिट को सुरक्षित रखना है, किसी मौजूदा ब्रांच पर लौटना है, या स्विच करने के बाद किसी कमिट को ढूंढना है। सही कमिट पर बनाई गई एक ब्रांच Git को आगे बढ़ते रहने के लिए एक नामित संदर्भ देती है।
स्रोत
git-switch दस्तावेज़ — Git
git-checkout दस्तावेज़ — Git
git-reflog दस्तावेज़ — Git
Mac पर Terminal खोलें या बंद करें — Apple Support