एक रिमाइंडर
यह समझने के लिए कि HEAD क्या है, आइए Git की अंतर्निहित ट्री-जैसी संरचना पर एक रिफ्रेशर करें।
- वर्किंग डायरेक्टरी: या वर्किंग ट्री। यह आपके स्थानीय डायरेक्टरी को संदर्भित करता है और
git statusआपको आपकी वर्किंग डायरेक्टरी की स्थिति देगा। - HEAD: यह सिर्फ आपकी वर्तमान ब्रांच का अंतिम कमिट स्नैपशॉट है। यदि आप
git checkoutके साथ ब्रांच स्विच करते हैं तो HEAD ब्रांच पर अंतिम कमिट में बदल जाएगा। - इंडेक्स: या स्टेजिंग एरिया, इसलिए जब आप कमिट करने के लिए
git addफ़ाइलें करते हैं तो यह उन्हें इस इंडेक्स में जोड़ता है।
अटैच्ड HEAD को समझना
अब हम समझते हैं कि HEAD सिर्फ उस ब्रांच पर नवीनतम कमिट है जिस पर आप हैं। git status करके यह आपकी ब्रांच बताएगा जैसे On branch master और git log करके यह आपकी कमिट हिस्ट्री बताएगा जैसे:
commit 38373004b8f651b58cea64cd629e1e2c18c164a0 (HEAD -> master, origin/master, origin/HEAD) Author: Felipe <email> Date: Wed Sep 29 22:57:59 2020 -0500
फिर अगर हम अपनी ब्रांच को डेवलपमेंट ब्रांच में बदलते हैं git checkout development के साथ तो HEAD अंतिम कमिट पर चला जाएगा। तो इन सभी सामान्य मामलों में HEAD हमारा पीछा कर रहा है क्योंकि यह उस ब्रांच पर अंतिम कमिट से जुड़ा हुआ है जिस पर हम हैं।
HEAD को डिटैच करना
हमारे HEAD को डिटैच करने के कुछ तरीके हैं।
git checkout --detachकमांड का उपयोग करना।- कमिट हैश पर चेकआउट करना। जैसे यदि हम ऊपर से कमिट का उपयोग करते हैं
git checkout 38373004b8f651b58cea64cd629e1e2c18c164a0 - किसी भी दी गई ब्रांच पर ^0 जोड़कर। जैसे
git checkout master^0।
मुझे यकीन नहीं है कि क्या आप जानबूझकर HEAD को डिटैच करना चाहेंगे। इसलिए सबसे आम मामला यह है कि गलती से आप किसी ब्रांच पर चेकआउट करना चाहते थे और ब्रांच नाम के बजाय कमिट हैश का उपयोग कर लिया।
तो डिटैच्ड HEAD के बाद क्या होता है? आपको इस तरह की चेतावनी मिल सकती है:
$ git checkout 38373004b8f651b58cea64cd629e1e2c18c164a0 Note: checking out '38373004b8f651b58cea64cd629e1e2c18c164a0'. 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.
एक बार डिटैच्ड HEAD एनवायरनमेंट पर, यदि आप git status करते हैं, भले ही आपने परिवर्तन किए हों, यह ऐसा कुछ कहेगा:
HEAD detached at ac63806 nothing to commit, working tree clean
तो यह ऐसा होगा जैसे आप समय में जम गए हैं और आप जो कुछ भी करते हैं वह खो जाता है, या केवल कहीं नहीं जा रहा है। क्यों? क्योंकि HEAD किसी चीज की ओर इशारा नहीं कर रहा है।
कुछ लोग रिपॉजिटरी के पिछले राज्य का पता लगाने के लिए इसे उपयोगी पाते हैं बिना चीजों को तोड़ने की चिंता के।
HEAD को फिर से अटैच करना
आपको यह समझना होगा कि यदि आप कभी डिटैच्ड स्टेट में आते हैं तो आपकी कोई भी ब्रांच प्रभावित नहीं होगी। अब, HEAD को फिर से अटैच करने का सबसे अच्छा तरीका एक नई ब्रांच बनाना है।
हम इसे git checkout -b <branch-name> जितना सरल कर सकते हैं।
क्या होगा अगर हमें एहसास नहीं हुआ कि हम बिना HEAD के थे और परिवर्तन करना शुरू कर दिया? ठीक है, यहां हमें एक अस्थायी ब्रांच बनाने और जिस ब्रांच में हमें कमिट करने की आवश्यकता है उसके साथ मर्ज करने की आवश्यकता होगी। उदाहरण के लिए:
git checkout -b temp-branch git checkout master git merge temp-branch
यह आपके अस्थायी ब्रांच से परिवर्तनों को उस ब्रांच में कमिट करेगा जिसमें आपको उनकी आवश्यकता है। इस मामले में master।
निष्कर्ष
आज हमने सीखा कि अपने HEAD को कैसे डिटैच करें (शाब्दिक रूप से नहीं) और बाद में क्या करना है। Git के आंतरिक कामकाज में HEAD क्या है, यह समझने से हमें डिटैच्ड HEAD जैसे विशेष मामलों को समझने में मदद मिल सकती है।
हमने यह भी सीखा कि अगर हम कभी डिटैच्ड HEAD स्टेट में आ जाते हैं तो चिंता न करें। बस ध्यान रखें कि चूंकि आपका HEAD ढीला है, परिवर्तन और कमिट कहीं भी प्रतिबिंबित नहीं होंगे। इसलिए सुनिश्चित करें कि आप HEAD को तदनुसार फिर से अटैच करते हैं।