GIT में HEAD क्या है?


1026

आप Git डॉक्यूमेंटेशन जैसी चीजों को कहते हैं

शाखा को पूरी तरह से हेड में विलय कर दिया जाना चाहिए।

लेकिन Git HEADवास्तव में क्या है ?



जवाबों:


774

आप HEAD को "वर्तमान शाखा" के रूप में सोच सकते हैं। जब आप शाखाओं को स्विच करते हैं git checkout, तो HEAD संशोधन नई शाखा के सिरे की ओर इंगित करता है।

आप देख सकते हैं कि HEAD क्या कर रहा है:

cat .git/HEAD

मेरे मामले में, आउटपुट है:

$ cat .git/HEAD
ref: refs/heads/master

HEAD के लिए एक विशिष्ट संशोधन का उल्लेख करना संभव है जो शाखा नाम से संबद्ध नहीं है। इस स्थिति को एक अलग हेड कहा जाता है ।


52
तो git HEAD संदर्भ पर निर्भर है जिस पर आप चल रहे हैं, सही है? आगे भी, आप एक डेवलपर के रूप में? मुझे लगता है कि मैं पूछ रहा हूं, क्या GIT HEAD एक रिपॉजिटरी-वाइड ग्लोबल चीज है, या प्रत्येक देव के लिए अलग-अलग है?
23

90
@bobobobo: यह सही है, HEAD एक पॉइंटर की तरह है जो वर्तमान शाखा को इंगित करता है। जब आप एक अलग शाखा की जांच करते हैं, तो HEAD नए को इंगित करता है। वर्तमान HEAD प्रत्येक रिपॉजिटरी के लिए स्थानीय है, और इसलिए प्रत्येक डेवलपर के लिए व्यक्तिगत है।
ग्रेग हेविगिल

16
@ मेन ने यह मेरी मदद की, आशा है कि यह मदद करता है: marklodato.github.com/visual-git-guide/index-en.html
राफेल

53
@ @,: HEAD किसी भी कमिट को इंगित कर सकता है , इसे किसी भी ब्रांच में अंतिम कमिट होने की आवश्यकता नहीं है। (जब HEAD एक कमिट को इंगित करता है जो एक ब्रांच में अंतिम कमिट नहीं है, वह "डिटैच्ड HEAD" है)।
ग्रेग हेविगेल

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

184

अन्य लोगों को उद्धृत करने के लिए :

एक सिर बस एक प्रतिबद्ध वस्तु का संदर्भ है। प्रत्येक सिर का एक नाम (शाखा का नाम या टैग नाम, आदि) होता है। डिफ़ॉल्ट रूप से, प्रत्येक रिपॉजिटरी में एक हेड होता है जिसे मास्टर कहा जाता है। एक रिपॉजिटरी में किसी भी संख्या में प्रमुख हो सकते हैं। किसी भी समय, एक सिर को "वर्तमान प्रमुख" के रूप में चुना जाता है। यह सिर हमेशा राजधानियों के लिए उतारा जाता है, "।

इस अंतर पर ध्यान दें: "हेड" (लोअरकेस) रिपॉजिटरी में नामित नामों में से किसी एक को संदर्भित करता है; "हेड" (अपरकेस) विशेष रूप से वर्तमान में सक्रिय प्रमुख को संदर्भित करता है। इस भेद का उपयोग अक्सर Git प्रलेखन में किया जाता है।

एक और अच्छा स्रोत जो जल्दी से गिट के आंतरिक कामकाज को कवर करता है (और इसके लिए सिर / हेड की बेहतर समझ है) यहां पाया जा सकता है । संदर्भ (रेफरी :) या सिर या शाखाओं को ऐसा माना जा सकता है कि यह पोस्ट इतिहास में प्रतिबद्ध इतिहास में लिखे गए नोट्स हैं। आमतौर पर वे प्रतिबद्ध की श्रृंखला की नोक को इंगित, लेकिन वे चारों ओर से ले जाया जा सकता git checkoutहै या git resetआदि


इससे: "प्रत्येक सिर का एक नाम है"। और "एक सिर" वर्तमान प्रमुख के रूप में चुना गया है। इस हेड को HEAD में बदल दिया गया है ”। इसलिए मैं इस बात से यह निष्कर्ष निकालता हूं कि "HEAD" राज्य की "अलग की गई स्थिति" का संदर्भ नहीं देता है।
gxyd 10

1
@gxyd अगर यह मामला है कि हेड एक 'सिर' की ओर इशारा नहीं करता है, तो यह एक अलग हेड है। यह आपके द्वारा निर्दिष्ट (उपयोग, उदाहरण के लिए git checkout HEAD~2) की प्रतिबद्ध आईडी की ओर इशारा कर रहा है , जो किसी ज्ञात प्रमुख की प्रतिबद्ध आईडी नहीं है। अधिक गहन स्पष्टीकरण के लिए eagain.net/articles/git-for-computer-scientists पर लेख देखें ।
सिल्फ़ेड

1
@Silfheed: आम तौर पर मुझे लगता है कि यह उत्तर स्वीकार किए जाते हैं (भले ही एक शाखा को संदर्भित करने के लिए "सिर" का उपयोग करके कई लोगों को भ्रमित करता है) की तुलना में वैचारिक रूप से अधिक ध्वनि है। हालाँकि git revert, टिप पर नहीं होने के लिए एक शाखा को स्थानांतरित करने का एक अच्छा उदाहरण नहीं है, क्योंकि git revertबस कुछ नए कमिट बनाता है और फिर भी (नई) टिप पर वर्तमान शाखा छोड़ देता है।
लार्श

1
"जो एक ज्ञात प्रमुख की प्रतिबद्ध आईडी नहीं है" - वास्तव में, एक अलग हेड एक प्रतिबद्ध आईडी पर इंगित कर सकता है जो कि एक ज्ञात सिर (या कई प्रमुख) की प्रतिबद्ध आईडी भी है। जो बात अलग है, वह यह है कि हेड सीधे आईडी पर इशारा कर रहा है, न कि सिर से। यह भविष्य के commits, resets, आदि के व्यवहार को प्रभावित करेगा
3

1
@ लार्स: एक संदर्भ के बजाय एक प्रतिबद्ध आईडी पर इंगित एक अलग हेड पर अच्छा बिंदु। आप वास्तव में .git / HEAD को देखकर इसे सत्यापित कर सकते हैं। यदि इसे अलग किया जाता है, तो इसमें एक कमिट का हैश होगा, भले ही यह एक ज्ञात हेड के समान ही हो। यदि यह जुड़ा हुआ है, तो इसमें सिर का मार्ग होगा (यानी 'Ref: refs / heads / bob')। 8 साल बाद, मैंने उस टाइपो को कभी नहीं पकड़ा। Git रीसेट वह है जो आपको किसी विशेष के लिए इंगित करने के लिए एक विशेष सिर को समायोजित करने की अनुमति देता है।
सिल्फ़ेड

62

मैं github डेवलपर स्कॉट चाकोन से इस परिभाषा की सिफारिश करता हूं [ वीडियो संदर्भ ]:

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

पूरा वीडियो पूरे गिट सिस्टम का उचित परिचय देगा, इसलिए मैं आपको यह सलाह भी देता हूं कि यदि समय हो तो आप इसे देख लें।


34
तो सच्चा दोष "आपके अगले वचन का जनक" है
निकोलस

1
और यह भी कि "अगली शाखा की ओर इशारा करने वाली बात जो आगे बढ़ेगी"
निकोलस

@nicolas - मुझे नहीं लगता कि यह सच है। एचईएडी किसी भी बिंदु पर इंगित कर सकता है, यह जरूरी नहीं कि एक शाखा पर इंगित करना है - जब यह नहीं होता है, तो आप "अलग किए गए हेड" मोड में हैं।
स्क्यूबो

23
वीडियो बहुत अच्छा है, लेकिन दुर्भाग्य से, यह स्टैक ओवरफ्लो के लिए एक बीमार-अनुकूल उत्तर बनाता है। अगर भविष्य में कभी-कभी वीडियो को नीचे ले जाया जाए तो क्या होगा? तब आपका लिंक कुछ नहीं करने के लिए इंगित करेगा। एक बेहतर जवाब में स्कॉट का वीडियो में क्या कहना है, की एक प्रतिलिपि शामिल होगी।

2
स्कॉट का कहना है कि हेड एक शाखा का सूचक है। लेकिन HEAD पुराने कमिट्स की ओर भी इशारा कर सकता है। यह sooo भ्रामक है।
फिक्सी

60

HEAD सिर्फ एक विशेष पॉइंटर है जो उस स्थानीय शाखा की ओर इशारा करता है जिस पर आप वर्तमान में हैं।

से प्रो Git पुस्तक, अध्याय 3.1 Git शाखाओं में बंटी - संक्षेप में शाखाओं , अनुभाग में एक नई शाखा का निर्माण :

यदि आप एक नई शाखा बनाते हैं तो क्या होगा? ठीक है, ऐसा करने से आपके घूमने का एक नया पॉइंटर बन जाता है। मान लीजिए कि आप परीक्षण नामक एक नई शाखा बनाते हैं। आप इसे git शाखा कमांड के साथ करते हैं:

$ git branch testing 

यह उसी समय पर एक नया पॉइंटर बनाता है जिस पर आप वर्तमान में हैं

यहां छवि विवरण दर्ज करें

Git कैसे जानता है कि आप वर्तमान में किस शाखा में हैं? यह HEAD नामक एक विशेष सूचक रखता है। ध्यान दें कि यह उन अन्य VCS में HEAD की अवधारणा से बहुत अलग है, जिनका उपयोग आपके लिए किया जा सकता है, जैसे कि सबवर्सन या CVS। Git में, यह उस स्थानीय शाखा का एक संकेतक है जो आप वर्तमान में हैं। इस मामले में, आप अभी भी मास्टर पर हैं। Git ब्रांच कमांड ने केवल एक नई ब्रांच बनाई - यह उस ब्रांच में नहीं गई।

यहां छवि विवरण दर्ज करें


4
अच्छा है, एक तस्वीर दिखा सकता है, हालांकि एचईएडी मामले को अलग कर दिया
डॉन हैच

@ डॉनचैच, अलग-थलग पड़ने की अच्छी व्याख्या HEAD stackoverflow.com/a/35301963/1074179
एलेक्जेंडर

3
अच्छा उत्तर। शाखाएँ कुछ भी नहीं हैं लेकिन लेबल किए गए हैं, जब आप नए कमिट करते हैं, तो यह लेबल नई नई कमिट में चला जाता है। जब आप एक ऐसे लेबल की जांच करते हैं जिसमें एक लेबल नहीं होता है, तो यह अलग अवस्था में है। इसका मतलब है कि हेड एक ऐसे कमेंट की ओर इशारा कर रहा है जिसमें ब्रांच लेबल नहीं है। यदि आप 34ac2उपर्युक्त उदाहरण में जांच करते हैं, तो अब HEAD उस प्रतिबद्ध की ओर इशारा करेगा और इसे एक अलग HEAD कहा जाएगा। इस स्थिति में, आप परिवर्तन कर सकते हैं, प्रयोग कर सकते हैं और परिवर्तन भी कर सकते हैं, लेकिन एक बार जब आप एक अलग शाखा की जाँच करते हैं, तो आप अपने सभी परिवर्तनों को खो देंगे, जब तक कि आप नई शाखा नहीं बनाते।
Sleepwalkerfx

1
@sleepwalkerfx लेकिन आप एक प्रतिबद्ध जांच कर सकते हैं जिसमें एक शाखा लेबल है और अभी भी अलग राज्य में है क्योंकि आपका HEAD अब शाखा लेबल की ओर इशारा नहीं करता है लेकिन शाखा की प्रतिबद्ध आईडी
मार्क

1
@sleepwalkerfx मुझे लगता है कि हम इस बिंदु पर शब्दार्थ के बारे में बात कर रहे हैं। आप सही हैं एक शाखा लेबल एक विशेष प्रतिबद्ध के लिए एक पाठ संदर्भ है। यह, हालांकि, एक प्रतिबद्ध नहीं है। तो अगर आपने किया git logऔर ऐसा कुछ मिला commit ad0265... HEAD -> foo ...तो इसका अर्थ होगा कि fooशाखा आईडी बनाने के लिए एक संदर्भ है ad0265। पाठ संदर्भ fooका एक चेकआउट करना एक अलग सिर नहीं है। कमिट आईडी का चेकआउट करने ad0265से एक अलग सिर हो जाएगा। हो सकता है कि जो कुछ आप संवाद कर रहे हैं, उसकी कुछ सूक्ष्मता मुझे याद आ रही है। मुझे आशा है कि पाठ की यह दीवार मुझे खोजने में मदद करती है कि मैं कहां खो गया हूं।
मार्क

40

यह मानते हुए कि यह एक विशेष मामला नहीं है जिसे "अलग किया गया हेड" कहा जाता है, फिर, जैसा कि ओ'रिली गिट बुक में कहा गया है, दूसरा संस्करण, p.69, का HEADअर्थ है:

HEADहमेशा वर्तमान शाखा पर सबसे हालिया प्रतिबद्ध को संदर्भित करता है। जब आप शाखाएँ बदलते हैं, HEADतो नई शाखा की नवीनतम प्रतिबद्ध को संदर्भित करने के लिए अद्यतन किया जाता है।

इसलिए

HEADहै वर्तमान शाखा के "टिप"

ध्यान दें कि हम HEADसबसे हाल की प्रतिबद्ध का उल्लेख करने के लिए उपयोग कर सकते हैं , और HEAD~टिप से पहले कमिट के रूप में उपयोग कर सकते हैं , और HEAD~~या HEAD~2फिर पहले भी कमिट के रूप में उपयोग कर सकते हैं ।


26

इन उत्तरों में से एक, शायद सूक्ष्म, लेकिन महत्वपूर्ण गलत धारणा है। मैंने सोचा था कि मैं इसे साफ करने के लिए अपना जवाब जोड़ दूंगा।

क्या है HEAD?

आप ही हैं

HEADएक प्रतीकात्मक संदर्भ है जहाँ आप अपने प्रतिबद्ध इतिहास में हैं। यह आपका अनुसरण करता है जहाँ भी आप जाते हैं, आप जो भी करते हैं, छाया की तरह। अगर आप कमिटमेंट HEADकरेंगे तो मूव करेंगे। यदि आप कुछ चेकआउट करते हैं, तो चलेंगे HEAD। आप जो कुछ भी करते हैं, यदि आप अपने प्रतिबद्ध इतिहास में कहीं नया स्थानांतरित कर चुके हैं, तो आप HEADके साथ चले गए हैं। एक आम गलत धारणा को संबोधित करने के लिए: आप खुद को इससे अलग नहीं कर सकते HEAD। वह नहीं है जो एक अलग राज्य है। यदि आप कभी भी खुद को सोच पाते हैं: "अरे नहीं, मैं अलग राज्य में हूँ! मैंने अपना सिर खो दिया है!" याद रखें, यह आपके सिर है। आप ही हैं। आपने हेड से अलग नहीं किया है, आपने और आपके हेड ने कुछ और से अलग किया है।

HEAD किससे जुड़ सकता है?

HEADएक कमिट की ओर इशारा कर सकते हैं, हां, लेकिन आमतौर पर ऐसा नहीं होता है। मुझे फिर वही बात कहना है। आमतौर पर HEADएक कमिट की ओर इशारा नहीं करता है। यह एक शाखा संदर्भ की ओर इशारा करता है। यह उस शाखा से जुड़ा हुआ है, और जब आप कुछ चीजें करते हैं (जैसे, commitया reset), तो जुड़ी हुई शाखा साथ चलेगी HEAD। आप देख सकते हैं कि यह हुड के नीचे देखकर क्या इशारा कर रहा है।

cat .git/HEAD

आम तौर पर आपको ऐसा कुछ मिलेगा:

ref: refs/heads/master

कभी-कभी आपको कुछ इस तरह मिलेगा:

a3c485d9688e3c6bc14b06ca1529f0e78edd3f86

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

यदि आप निम्न अभ्यास का प्रयास करते हैं तो आप इस रेखांकन को देख सकते हैं। गिट रिपॉजिटरी से, इसे चलाएं। आपको कुछ अलग मिलेगा, लेकिन वे मुख्य बिट्स होंगे। जब सीधे तौर पर कमिटमेंट चेक करने का समय आता है, तो पहले आउटपुट से जो भी संक्षिप्त हैश प्राप्त करें (यहाँ यह है a3c485d) का उपयोग करें।

git checkout master
git log --pretty=format:"%h:  %d" -1
# a3c485d:   (HEAD -> master)

git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h:  %d" -1   
# a3c485d:   (HEAD, master)

ठीक है, इसलिए यहां आउटपुट में एक छोटा सा अंतर है। सीधे (शाखा के बजाय) कमिट को जाँचना हमें एक तीर के बजाय एक अल्पविराम देता है। आपको क्या लगता है, क्या हम एक अलग राज्य में हैं? HEAD अभी भी एक विशिष्ट संशोधन का उल्लेख कर रहा है जो एक शाखा नाम के साथ जुड़ा हुआ है। हम अभी भी कर रहे हैं पर हम नहीं मास्टर शाखा, कर रहे हैं?

अब कोशिश करो:

git status
# HEAD detached at a3c485d

नहीं। हम 'अलग' राज्य में हैं।

आप के साथ (HEAD -> branch)बनाम का एक ही प्रतिनिधित्व देख सकते हैं ।(HEAD, branch)git log -1

निष्कर्ष के तौर पर

HEADतुम हो। यह आपकी ओर से जो कुछ भी है, उसकी ओर इशारा करता है। आमतौर पर यह एक प्रतिबद्ध नहीं है, यह एक शाखा है। यदि HEAD वह किसी कमिट (या टैग) की ओर इशारा करता है , भले ही वह एक ही कमिट (या टैग) हो जो एक शाखा को भी इंगित करता है, तो आपको (और HEAD) उस शाखा से अलग कर दिया गया है। चूँकि आपके पास कोई शाखा नहीं है, इसलिए शाखा आपके साथ नहीं चलेगी क्योंकि आप नए कार्य करते हैं। HEADहालाँकि, होगा।


1
मुझे यह उत्तर पसंद है, क्योंकि जब दस्तावेज़ सत्य का वर्णन करता है, तो सॉफ़्टवेयर सत्य को परिभाषित करता है। .git/HEADसॉफ्टवेयर को HEAD माना जाता है।
डॉन ब्रैनसन

2
अकेले इसकी वैचारिक परिभाषा के लिए, यह स्वीकृत उत्तर होना चाहिए।
अता

22

HEADवर्तमान प्रतिबद्ध को संदर्भित करता है कि आपकी काम करने की प्रतिलिपि इंगित करती है, अर्थात आपके द्वारा वर्तमान में चेक-आउट किया गया है। से Git संशोधन निर्दिष्ट करने पर आधिकारिक लिनक्स कर्नेल प्रलेखन :

HEAD उस कमेट का नाम, जिस पर आपने काम करने वाले पेड़ में बदलाव किए हैं।

हालाँकि, ध्यान दें कि आगामी संस्करण 1.8.4 में Git का @उपयोग शॉर्टहैंड के रूप में भी किया जा सकता है HEAD, जैसा कि Git योगदानकर्ता Junio ​​C Hamano ने अपने Git Blame ब्लॉग में लिखा है :

"HEAD" टाइप करने के बजाय, आप "@" कह सकते हैं, उदाहरण के लिए "git log @"।

स्टैक ओवरफ्लो उपयोगकर्ता VonC ने इस बारे में@ भी कुछ दिलचस्प जानकारी पाई कि एक अन्य प्रश्न के उत्तर में शॉर्टहैंड के रूप में क्यों चुना गया था

रुचि के अलावा, कुछ वातावरणों में इसे भुनाने की आवश्यकता नहीं है HEAD, विशेष रूप से ऑपरेटिंग सिस्टम में जो केस-असंवेदनशील फाइल सिस्टम का उपयोग करते हैं, विशेष रूप से विंडोज और ओएस एक्स।


17

पर एक नजर डालें बनाना और शाखाओं के साथ खेल

HEAD वास्तव में एक फाइल है जिसका कंटेंट यह निर्धारित करता है कि HEAD वेरिएबल कहां है:

$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed

इस रिपॉजिटरी में, HEAD फ़ाइल की सामग्री रेफरी / हेड / मास्टर नामक एक दूसरी फ़ाइल को संदर्भित करती है । फ़ाइल refs / हेड / मास्टर में मास्टर ब्रांच पर सबसे हालिया कमिट का हैश होता है।

इसका परिणाम .IT / refs / हेड्स / मास्टर फ़ाइल से प्रतिबद्ध मास्टर ब्रांच के लिए HEAD अंक है ।

यहां छवि विवरण दर्ज करें


1
सावधान: gitguys.com लिंक एक पार्क किए गए डोमेन को इंगित करता है।
एमकेस्पर

14

मैं ग्रेग हेवगिल के स्वीकृत उत्तर में कुछ बातें विस्तार से बताना चाहूंगा। गिट पॉकेट गाइड के अनुसार

डाली:

शाखा को ही नामित अंक (शाखा के "टिप") से कमिट ग्राफ में उपलब्ध सभी बिंदुओं के रूप में परिभाषित किया गया है।

HEAD: रेफ का एक विशेष प्रकार

विशेष रेफरी HEAD निर्धारित करता है कि आप किस शाखा में हैं ...

refs

गिट दो प्रकार के संदर्भों, या नामित बिंदुओं को परिभाषित करता है, जिसे वह "रेफ्स" कहते हैं:

  • एक साधारण रेफरी, जो सीधे एक वस्तु आईडी (आमतौर पर एक प्रतिबद्ध या टैग) को इंगित करता है
  • एक प्रतीकात्मक रेफरी (या सिम्फ़र), जो दूसरे रेफरी की ओर इशारा करता है (या तो सरल या प्रतीकात्मक)

जैसा कि ग्रेग ने उल्लेख किया है, HEAD एक "अलग राज्य" में हो सकता है। तो HEAD या तो एक साधारण रेफ (एक अलग HEAD के लिए) या एक सिम्फ़र हो सकता है।

यदि HEAD एक मौजूदा शाखा के लिए एक प्रतीकात्मक रेफरी है, तो आप उस शाखा के "चालू" हैं। यदि, दूसरी ओर, HEAD एक सरल रेफरी है, जो सीधे तौर पर अपनी SHA-1 आईडी द्वारा एक नामकरण कर रहा है, तो आप "किसी भी शाखा" पर नहीं हैं, बल्कि "अलग एचएएडी" मोड में हैं, जो तब होता है जब आप कुछ चेक आउट करते हैं। जांच करने के लिए प्रतिबद्ध है।


धन्यवाद, @ मायिक! यह पहला उत्तर है जो स्पष्ट करता है कि जब आप पहले की प्रतिबद्ध जांच करते हैं तो क्या होता है। Git वेबसाइट पर किताब को देखते हुए , मुझे यह आभास हुआ कि एक "डिटैच्ड HEAD" एक पैथोलॉजिकल स्टेट था जिसे आप केवल तभी प्राप्त कर सकते थे जब आप कुछ अजीब रीबैजिंग बात करते थे। लेकिन पहले की प्रतिबद्ध जांच करना कोई अजीब बात नहीं है, और जब आप ऐसा करते हैं, तो HEAD "वर्तमान शाखा का सिरा" नहीं है। इसलिए यह पहली बार है जब मुझे लगता है कि मैं वास्तव में समझ रहा हूं।
नट कुह्न

7

मुझे लगता है कि 'हेड' वर्तमान जांच है। दूसरे शब्दों में 'हेड' उस कमिट को इंगित करता है जो वर्तमान में चेक आउट है।

यदि आपने अभी-अभी क्लोन किया है और चेक आउट नहीं किया है, तो मुझे नहीं पता कि यह क्या इंगित करता है, शायद कुछ अमान्य स्थान।


हां, विशेष संदर्भ HEADवह है जो आप वर्तमान में चेक-आउट कर चुके हैं। देखें मैनुअल जानकारी के लिए (प्रासंगिक पैराग्राफ तुरंत छवि 3.4 इस प्रकार है)।
कालरात्रि

1
यदि आप एक रिपॉजिटरी को क्लोन करते हैं, तो गिट डिफॉल्ट रूप से masterब्रांच को चेक करेगा - इसलिए HEAD मास्टर को इंगित करेगा।
तिल

1
यदि आप कोई विशेष विकल्प नहीं देते हैं तो @sleske रिमोट हेड की जांच करेगा। यह आमतौर पर होता है master, लेकिन यह हमेशा नहीं होता है। देखेंremote set-head
De Novo

मेरी पिछली टिप्पणी remote set-headकेवल संदर्भ के अलावा सही थी , जो केवल स्थानीय डिफ़ॉल्ट शाखा को प्रभावित करती है, और सर्वर पर डिफ़ॉल्ट को नहीं बदलेगी।
डे नोवो

5

वर्तमान में जाँच की गई शाखा के सिरे की ओर सिर।

यहां छवि विवरण दर्ज करें

आपके रिपॉजिटरी में, .git फ़ोल्डर है। इस स्थान पर फ़ाइल खोलें: .git \ refs \ head। उस फ़ाइल में शा (1 हैश) कोड (ज्यादातर मामलों में मास्टर) सबसे हालिया प्रतिबद्ध होगा, यानी कमांड के आउटपुट में देखा जाने वाला git log। .Git फ़ोल्डर पर अधिक जानकारी: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html


1
यह एक आम गलत धारणा है कि वर्तमान शाखा की नोक सबसे हालिया प्रतिबद्ध की ओर इशारा करती है। आमतौर पर यह सच है, लेकिन यह भी असामान्य नहीं है git reset HEAD^, और फिर सबसे हालिया प्रतिबद्ध (पूर्व टिप) अब शाखा की नोक से इंगित नहीं किया गया है।
लार्श

4

घर को सही उत्तरों में बनाए गए बिंदु को चलाने का एक शानदार तरीका है git reflog HEAD, आप उन सभी स्थानों का इतिहास प्राप्त करते हैं जिन्हें HEAD ने इंगित किया है।


4

पिछले सभी उत्तरों को पढ़ने के बाद, मैं अभी भी अधिक स्पष्टता चाहता था। आधिकारिक git वेबसाइट http://git-scm.com/blog पर इस ब्लॉग ने मुझे वही दिया , जिसकी मुझे तलाश थी:

सिर: अगले माता-पिता को अंतिम वचन देने के लिए इशारा करता है

हिट में जीआईएटी वर्तमान शाखा संदर्भ का सूचक है, जो आपके द्वारा किए गए अंतिम कमिट या अंतिम कार्य करने के लिए एक संकेतक है जो आपके कार्य निर्देशिका में जांचा गया था। इसका मतलब यह भी है कि यह आपके द्वारा की गई अगली प्रतिबद्धता का जनक होगा। यह आम तौर पर यह सोचने के लिए सबसे सरल है क्योंकि HEAD आपके अंतिम प्रतिबद्ध का स्नैपशॉट है।


1
हेड: अंतिम प्रतिबद्ध स्नैपशॉट, अगला अभिभावक सटीक नहीं है। HEADएक प्रतिबद्ध नहीं है; यह एक को इंगित करता है।
18

कटाक्ष की कोई जरूरत नहीं; आपके संपादन से पहले, भले ही उद्धरण सटीक था, बड़े बोल्ड अक्षर एक सरलीकरण और थोड़ा भ्रामक थे। अब यह बेहतर है।
जुब्ब्

1
यदि आप अगली पंक्ति पढ़ते हैं: HEAD in Git , वर्तमान शाखा संदर्भ का सूचक है, जो आपके द्वारा किए गए अंतिम कमिट या अंतिम प्रतिबद्ध के लिए एक पॉइंटर को चालू करता है जिसे आपके वर्किंग डायरेक्टरी में चेक किया गया था। - कृपया वहाँ "सूचक" शब्द के उपयोग पर ध्यान दें।
user3751385 15

हालांकि "अंतिम प्रतिबद्ध स्नैपशॉट" विवरण यह बताता है कि कैसे आम तौर पर एचएएडी का उपयोग किया जाना चाहिए, यह वास्तव में सटीक नहीं है। अगर मैं कमिट करता हूं, तो दूसरी ब्रांच पर जाएं, HEAD अब आखिरी कमिट स्नैपशॉट की ओर इशारा नहीं करता है। यह उस शाखा पर अंतिम प्रतिबद्ध स्नैपशॉट को इंगित करता है जिसे मैंने अभी स्विच किया था। यदि मैं checkout HEAD^, अब HEAD किसी भी शाखा पर अंतिम प्रतिबद्ध स्नैपशॉट को इंगित नहीं करता है।
लार्स

"आपकी अगली प्रतिबद्ध माता-पिता (यदि आप अभी काम करना चाहते थे)" अधिक सटीक है, लेकिन जीआईटी के अलावा कई अन्य ऑपरेशन भी हैं जो एचएएडी से प्रभावित हैं। वास्तव में, अंत में, प्रमुख प्रमुख है, और यह कैसे की तरह आदेशों को प्रभावित करता है अपने स्वभाव से परिभाषित किया गया है commit, merge, rebase, log, आदि लेकिन धारणात्मक हो सकता है "(सूचक) वर्तमान स्थिति" एक अच्छा सारांश है।
लार्स

3

ऐसा लगता है कि HEADयह आखिरी कमिट के लिए एक टैग है जिसे आपने चेक किया था।

यह एक विशिष्ट शाखा की नोक हो सकती है (जैसे "मास्टर") या किसी शाखा के बीच में कुछ ("अलग सिर")


1

सभी परिभाषाओं के अलावा, मेरे दिमाग में जो चीज अटकी हुई थी, जब आप एक कमिट करते हैं, तो जीआईटी रिपॉजिटरी के भीतर एक कमिट ऑब्जेक्ट बनाता है। प्रतिबद्ध वस्तुओं में एक माता-पिता (या कई माता-पिता होने चाहिए अगर यह एक मर्ज कमिट है)। अब, वर्तमान के माता-पिता को कैसे पता चलता है? तो HEAD अंतिम कमिटमेंट का एक पॉइंटर (संदर्भ) है जो वर्तमान कमेंट का जनक बन जाएगा।


0

ये दोनों आपको भ्रमित कर सकते हैं:

सिर

नामित संदर्भों की ओर इशारा करते हुए हाल ही में प्रस्तुत एक शाखा। जब तक आप पैकेज संदर्भ का उपयोग नहीं करते हैं, आमतौर पर $ GIT_DIR / refs / heads / में संग्रहीत सिर।

सिर

वर्तमान शाखा, या आपका काम करने वाला पेड़ आमतौर पर उस पेड़ से उत्पन्न होता है जिस पर HEAD इशारा कर रहा है। सिर एक सिर की ओर इशारा करना चाहिए, सिवाय इसके कि आप एक अलग सिर का उपयोग कर रहे हैं।


0

Http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is पर एक नज़र डालें

चित्र 3-5। आप जिस शाखा पर हैं, उसकी ओर इशारा करते हुए हेड फ़ाइल।


4
लिंक केवल उत्तर आमतौर पर Stackoverflow पर frowned हैं, कृपया अपने उत्तर में प्रासंगिक जानकारी को इनलाइन करें।
हास्केल इलियट

2
यह पूरी तरह से सही नहीं है। क्या HEADआप एक नंगे बनाम एक नंगे नंगे रेपो के बारे में बात कर रहे हैं पर निर्भर करता है। गैर-नंगे रेपो के संदर्भ में, यह वर्तमान में चेक-आउट किए गए कमिट को प्रभावी रूप से संदर्भित करता है, जिसके लिए इससे जुड़ी एक शाखा होने की आवश्यकता नहीं है (अर्थात जब अलग HEADराज्य में)।

0

एक शाखा वास्तव में एक संकेतक है जो एक प्रतिबद्ध आईडी रखती है जैसे कि 17a5HEAD उस ब्रांच का पॉइंटर है, जिस पर यूजर अभी काम कर रहा है।

HEAD में एक संदर्भ फाइल है जो इस तरह दिखता है:

संदर्भ:

आप इन फ़ाइलों की जाँच करके उन तक पहुँच .git/HEAD .git/refsसकते हैं जो आपके द्वारा काम कर रहे भंडार में हैं।


0

Gitसभी के बारे में है
और Headउस कमिट को इंगित करता है जिसे आपने वर्तमान में चेक आउट किया है।

$ git cat-file -t HEAD
commit

जब भी आप किसी शाखा की जांच करते हैं, तो HEAD उस शाखा की नवीनतम प्रतिबद्ध की ओर इशारा करता है। HEAD की सामग्री नीचे (मास्टर शाखा के लिए) जाँच की जा सकती है:

$ cat .git/refs/heads/master
  b089141cc8a7d89d606b2f7c15bfdc48640a8e25

-5

एक अवधारणा के रूप में, हेड एक शाखा में नवीनतम संशोधन है। यदि आपके पास नामांकित शाखा के प्रति एक से अधिक सिर हैं, तो आपने संभवतः विलय के बिना स्थानीय कमिट करते समय इसे बनाया, प्रभावी रूप से एक अनाम शाखा का निर्माण।

"क्लीन" रिपॉजिटरी रखने के लिए, आपके पास नामित शाखा के प्रति एक सिर होना चाहिए और स्थानीय स्तर पर काम करने के बाद हमेशा एक नामित शाखा में विलय हो जाना चाहिए।

मर्क्यूरियल के लिए भी यह सही है ।


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