आप Git डॉक्यूमेंटेशन जैसी चीजों को कहते हैं
शाखा को पूरी तरह से हेड में विलय कर दिया जाना चाहिए।
लेकिन Git HEAD
वास्तव में क्या है ?
आप Git डॉक्यूमेंटेशन जैसी चीजों को कहते हैं
शाखा को पूरी तरह से हेड में विलय कर दिया जाना चाहिए।
लेकिन Git HEAD
वास्तव में क्या है ?
जवाबों:
आप HEAD को "वर्तमान शाखा" के रूप में सोच सकते हैं। जब आप शाखाओं को स्विच करते हैं git checkout
, तो HEAD संशोधन नई शाखा के सिरे की ओर इंगित करता है।
आप देख सकते हैं कि HEAD क्या कर रहा है:
cat .git/HEAD
मेरे मामले में, आउटपुट है:
$ cat .git/HEAD
ref: refs/heads/master
HEAD के लिए एक विशिष्ट संशोधन का उल्लेख करना संभव है जो शाखा नाम से संबद्ध नहीं है। इस स्थिति को एक अलग हेड कहा जाता है ।
अन्य लोगों को उद्धृत करने के लिए :
एक सिर बस एक प्रतिबद्ध वस्तु का संदर्भ है। प्रत्येक सिर का एक नाम (शाखा का नाम या टैग नाम, आदि) होता है। डिफ़ॉल्ट रूप से, प्रत्येक रिपॉजिटरी में एक हेड होता है जिसे मास्टर कहा जाता है। एक रिपॉजिटरी में किसी भी संख्या में प्रमुख हो सकते हैं। किसी भी समय, एक सिर को "वर्तमान प्रमुख" के रूप में चुना जाता है। यह सिर हमेशा राजधानियों के लिए उतारा जाता है, "।
इस अंतर पर ध्यान दें: "हेड" (लोअरकेस) रिपॉजिटरी में नामित नामों में से किसी एक को संदर्भित करता है; "हेड" (अपरकेस) विशेष रूप से वर्तमान में सक्रिय प्रमुख को संदर्भित करता है। इस भेद का उपयोग अक्सर Git प्रलेखन में किया जाता है।
एक और अच्छा स्रोत जो जल्दी से गिट के आंतरिक कामकाज को कवर करता है (और इसके लिए सिर / हेड की बेहतर समझ है) यहां पाया जा सकता है । संदर्भ (रेफरी :) या सिर या शाखाओं को ऐसा माना जा सकता है कि यह पोस्ट इतिहास में प्रतिबद्ध इतिहास में लिखे गए नोट्स हैं। आमतौर पर वे प्रतिबद्ध की श्रृंखला की नोक को इंगित, लेकिन वे चारों ओर से ले जाया जा सकता git checkout
है या git reset
आदि
git checkout HEAD~2
) की प्रतिबद्ध आईडी की ओर इशारा कर रहा है , जो किसी ज्ञात प्रमुख की प्रतिबद्ध आईडी नहीं है। अधिक गहन स्पष्टीकरण के लिए eagain.net/articles/git-for-computer-scientists पर लेख देखें ।
git revert
, टिप पर नहीं होने के लिए एक शाखा को स्थानांतरित करने का एक अच्छा उदाहरण नहीं है, क्योंकि git revert
बस कुछ नए कमिट बनाता है और फिर भी (नई) टिप पर वर्तमान शाखा छोड़ देता है।
commit
s, reset
s, आदि के व्यवहार को प्रभावित करेगा
मैं github डेवलपर स्कॉट चाकोन से इस परिभाषा की सिफारिश करता हूं [ वीडियो संदर्भ ]:
हेड आपकी करंट ब्रांच है। यह एक प्रतीकात्मक संदर्भ है। यह एक शाखा का संदर्भ है। आपके पास हमेशा HEAD होता है, लेकिन HEAD इन अन्य बिंदुओं में से एक की ओर इशारा करेगा, जिसकी एक शाखा पर आप हैं। यह आपके अगले वचन का जनक है। यह वही होना चाहिए जो आपकी कार्यशील निर्देशिका में अंतिम बार चेक-आउट किया गया हो ... यह अंतिम ज्ञात स्थिति है कि आपकी कार्यशील निर्देशिका क्या थी।
पूरा वीडियो पूरे गिट सिस्टम का उचित परिचय देगा, इसलिए मैं आपको यह सलाह भी देता हूं कि यदि समय हो तो आप इसे देख लें।
HEAD सिर्फ एक विशेष पॉइंटर है जो उस स्थानीय शाखा की ओर इशारा करता है जिस पर आप वर्तमान में हैं।
से प्रो Git पुस्तक, अध्याय 3.1 Git शाखाओं में बंटी - संक्षेप में शाखाओं , अनुभाग में एक नई शाखा का निर्माण :
यदि आप एक नई शाखा बनाते हैं तो क्या होगा? ठीक है, ऐसा करने से आपके घूमने का एक नया पॉइंटर बन जाता है। मान लीजिए कि आप परीक्षण नामक एक नई शाखा बनाते हैं। आप इसे git शाखा कमांड के साथ करते हैं:
$ git branch testing
यह उसी समय पर एक नया पॉइंटर बनाता है जिस पर आप वर्तमान में हैं
Git कैसे जानता है कि आप वर्तमान में किस शाखा में हैं? यह HEAD नामक एक विशेष सूचक रखता है। ध्यान दें कि यह उन अन्य VCS में HEAD की अवधारणा से बहुत अलग है, जिनका उपयोग आपके लिए किया जा सकता है, जैसे कि सबवर्सन या CVS। Git में, यह उस स्थानीय शाखा का एक संकेतक है जो आप वर्तमान में हैं। इस मामले में, आप अभी भी मास्टर पर हैं। Git ब्रांच कमांड ने केवल एक नई ब्रांच बनाई - यह उस ब्रांच में नहीं गई।
34ac2
उपर्युक्त उदाहरण में जांच करते हैं, तो अब HEAD उस प्रतिबद्ध की ओर इशारा करेगा और इसे एक अलग HEAD कहा जाएगा। इस स्थिति में, आप परिवर्तन कर सकते हैं, प्रयोग कर सकते हैं और परिवर्तन भी कर सकते हैं, लेकिन एक बार जब आप एक अलग शाखा की जाँच करते हैं, तो आप अपने सभी परिवर्तनों को खो देंगे, जब तक कि आप नई शाखा नहीं बनाते।
git log
और ऐसा कुछ मिला commit ad0265... HEAD -> foo ...
तो इसका अर्थ होगा कि foo
शाखा आईडी बनाने के लिए एक संदर्भ है ad0265
। पाठ संदर्भ foo
का एक चेकआउट करना एक अलग सिर नहीं है। कमिट आईडी का चेकआउट करने ad0265
से एक अलग सिर हो जाएगा। हो सकता है कि जो कुछ आप संवाद कर रहे हैं, उसकी कुछ सूक्ष्मता मुझे याद आ रही है। मुझे आशा है कि पाठ की यह दीवार मुझे खोजने में मदद करती है कि मैं कहां खो गया हूं।
यह मानते हुए कि यह एक विशेष मामला नहीं है जिसे "अलग किया गया हेड" कहा जाता है, फिर, जैसा कि ओ'रिली गिट बुक में कहा गया है, दूसरा संस्करण, p.69, का HEAD
अर्थ है:
HEAD
हमेशा वर्तमान शाखा पर सबसे हालिया प्रतिबद्ध को संदर्भित करता है। जब आप शाखाएँ बदलते हैं,HEAD
तो नई शाखा की नवीनतम प्रतिबद्ध को संदर्भित करने के लिए अद्यतन किया जाता है।
इसलिए
HEAD
है वर्तमान शाखा के "टिप" ।
ध्यान दें कि हम HEAD
सबसे हाल की प्रतिबद्ध का उल्लेख करने के लिए उपयोग कर सकते हैं , और HEAD~
टिप से पहले कमिट के रूप में उपयोग कर सकते हैं , और HEAD~~
या HEAD~2
फिर पहले भी कमिट के रूप में उपयोग कर सकते हैं ।
इन उत्तरों में से एक, शायद सूक्ष्म, लेकिन महत्वपूर्ण गलत धारणा है। मैंने सोचा था कि मैं इसे साफ करने के लिए अपना जवाब जोड़ दूंगा।
क्या है
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
हालाँकि, होगा।
.git/HEAD
सॉफ्टवेयर को HEAD माना जाता है।
HEAD
वर्तमान प्रतिबद्ध को संदर्भित करता है कि आपकी काम करने की प्रतिलिपि इंगित करती है, अर्थात आपके द्वारा वर्तमान में चेक-आउट किया गया है। से Git संशोधन निर्दिष्ट करने पर आधिकारिक लिनक्स कर्नेल प्रलेखन :
HEAD
उस कमेट का नाम, जिस पर आपने काम करने वाले पेड़ में बदलाव किए हैं।
हालाँकि, ध्यान दें कि आगामी संस्करण 1.8.4 में Git का @
उपयोग शॉर्टहैंड के रूप में भी किया जा सकता है HEAD
, जैसा कि Git योगदानकर्ता Junio C Hamano ने अपने Git Blame ब्लॉग में लिखा है :
"HEAD" टाइप करने के बजाय, आप "@" कह सकते हैं, उदाहरण के लिए "git log @"।
स्टैक ओवरफ्लो उपयोगकर्ता VonC ने इस बारे में@
भी कुछ दिलचस्प जानकारी पाई कि एक अन्य प्रश्न के उत्तर में शॉर्टहैंड के रूप में क्यों चुना गया था ।
रुचि के अलावा, कुछ वातावरणों में इसे भुनाने की आवश्यकता नहीं है HEAD
, विशेष रूप से ऑपरेटिंग सिस्टम में जो केस-असंवेदनशील फाइल सिस्टम का उपयोग करते हैं, विशेष रूप से विंडोज और ओएस एक्स।
पर एक नजर डालें बनाना और शाखाओं के साथ खेल
HEAD वास्तव में एक फाइल है जिसका कंटेंट यह निर्धारित करता है कि HEAD वेरिएबल कहां है:
$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed
इस रिपॉजिटरी में, HEAD फ़ाइल की सामग्री रेफरी / हेड / मास्टर नामक एक दूसरी फ़ाइल को संदर्भित करती है । फ़ाइल refs / हेड / मास्टर में मास्टर ब्रांच पर सबसे हालिया कमिट का हैश होता है।
इसका परिणाम .IT / refs / हेड्स / मास्टर फ़ाइल से प्रतिबद्ध मास्टर ब्रांच के लिए HEAD अंक है ।
मैं ग्रेग हेवगिल के स्वीकृत उत्तर में कुछ बातें विस्तार से बताना चाहूंगा। गिट पॉकेट गाइड के अनुसार
डाली:
शाखा को ही नामित अंक (शाखा के "टिप") से कमिट ग्राफ में उपलब्ध सभी बिंदुओं के रूप में परिभाषित किया गया है।
HEAD: रेफ का एक विशेष प्रकार
विशेष रेफरी HEAD निर्धारित करता है कि आप किस शाखा में हैं ...
refs
गिट दो प्रकार के संदर्भों, या नामित बिंदुओं को परिभाषित करता है, जिसे वह "रेफ्स" कहते हैं:
- एक साधारण रेफरी, जो सीधे एक वस्तु आईडी (आमतौर पर एक प्रतिबद्ध या टैग) को इंगित करता है
- एक प्रतीकात्मक रेफरी (या सिम्फ़र), जो दूसरे रेफरी की ओर इशारा करता है (या तो सरल या प्रतीकात्मक)
जैसा कि ग्रेग ने उल्लेख किया है, HEAD एक "अलग राज्य" में हो सकता है। तो HEAD या तो एक साधारण रेफ (एक अलग HEAD के लिए) या एक सिम्फ़र हो सकता है।
यदि HEAD एक मौजूदा शाखा के लिए एक प्रतीकात्मक रेफरी है, तो आप उस शाखा के "चालू" हैं। यदि, दूसरी ओर, HEAD एक सरल रेफरी है, जो सीधे तौर पर अपनी SHA-1 आईडी द्वारा एक नामकरण कर रहा है, तो आप "किसी भी शाखा" पर नहीं हैं, बल्कि "अलग एचएएडी" मोड में हैं, जो तब होता है जब आप कुछ चेक आउट करते हैं। जांच करने के लिए प्रतिबद्ध है।
मुझे लगता है कि 'हेड' वर्तमान जांच है। दूसरे शब्दों में 'हेड' उस कमिट को इंगित करता है जो वर्तमान में चेक आउट है।
यदि आपने अभी-अभी क्लोन किया है और चेक आउट नहीं किया है, तो मुझे नहीं पता कि यह क्या इंगित करता है, शायद कुछ अमान्य स्थान।
master
ब्रांच को चेक करेगा - इसलिए HEAD मास्टर को इंगित करेगा।
master
, लेकिन यह हमेशा नहीं होता है। देखेंremote set-head
remote set-head
केवल संदर्भ के अलावा सही थी , जो केवल स्थानीय डिफ़ॉल्ट शाखा को प्रभावित करती है, और सर्वर पर डिफ़ॉल्ट को नहीं बदलेगी।
वर्तमान में जाँच की गई शाखा के सिरे की ओर सिर।
आपके रिपॉजिटरी में, .git फ़ोल्डर है। इस स्थान पर फ़ाइल खोलें: .git \ refs \ head। उस फ़ाइल में शा (1 हैश) कोड (ज्यादातर मामलों में मास्टर) सबसे हालिया प्रतिबद्ध होगा, यानी कमांड के आउटपुट में देखा जाने वाला git log
। .Git फ़ोल्डर पर अधिक जानकारी: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html
git reset HEAD^
, और फिर सबसे हालिया प्रतिबद्ध (पूर्व टिप) अब शाखा की नोक से इंगित नहीं किया गया है।
पिछले सभी उत्तरों को पढ़ने के बाद, मैं अभी भी अधिक स्पष्टता चाहता था। आधिकारिक git वेबसाइट http://git-scm.com/blog पर इस ब्लॉग ने मुझे वही दिया , जिसकी मुझे तलाश थी:
हिट में जीआईएटी वर्तमान शाखा संदर्भ का सूचक है, जो आपके द्वारा किए गए अंतिम कमिट या अंतिम कार्य करने के लिए एक संकेतक है जो आपके कार्य निर्देशिका में जांचा गया था। इसका मतलब यह भी है कि यह आपके द्वारा की गई अगली प्रतिबद्धता का जनक होगा। यह आम तौर पर यह सोचने के लिए सबसे सरल है क्योंकि HEAD आपके अंतिम प्रतिबद्ध का स्नैपशॉट है।
HEAD
एक प्रतिबद्ध नहीं है; यह एक को इंगित करता है।
checkout HEAD^
, अब HEAD किसी भी शाखा पर अंतिम प्रतिबद्ध स्नैपशॉट को इंगित नहीं करता है।
commit
, merge
, rebase
, log
, आदि लेकिन धारणात्मक हो सकता है "(सूचक) वर्तमान स्थिति" एक अच्छा सारांश है।
ऐसा लगता है कि HEAD
यह आखिरी कमिट के लिए एक टैग है जिसे आपने चेक किया था।
यह एक विशिष्ट शाखा की नोक हो सकती है (जैसे "मास्टर") या किसी शाखा के बीच में कुछ ("अलग सिर")
सभी परिभाषाओं के अलावा, मेरे दिमाग में जो चीज अटकी हुई थी, जब आप एक कमिट करते हैं, तो जीआईटी रिपॉजिटरी के भीतर एक कमिट ऑब्जेक्ट बनाता है। प्रतिबद्ध वस्तुओं में एक माता-पिता (या कई माता-पिता होने चाहिए अगर यह एक मर्ज कमिट है)। अब, वर्तमान के माता-पिता को कैसे पता चलता है? तो HEAD अंतिम कमिटमेंट का एक पॉइंटर (संदर्भ) है जो वर्तमान कमेंट का जनक बन जाएगा।
ये दोनों आपको भ्रमित कर सकते हैं:
सिर
नामित संदर्भों की ओर इशारा करते हुए हाल ही में प्रस्तुत एक शाखा। जब तक आप पैकेज संदर्भ का उपयोग नहीं करते हैं, आमतौर पर $ GIT_DIR / refs / heads / में संग्रहीत सिर।
सिर
वर्तमान शाखा, या आपका काम करने वाला पेड़ आमतौर पर उस पेड़ से उत्पन्न होता है जिस पर HEAD इशारा कर रहा है। सिर एक सिर की ओर इशारा करना चाहिए, सिवाय इसके कि आप एक अलग सिर का उपयोग कर रहे हैं।
Http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is पर एक नज़र डालें
चित्र 3-5। आप जिस शाखा पर हैं, उसकी ओर इशारा करते हुए हेड फ़ाइल।
HEAD
आप एक नंगे बनाम एक नंगे नंगे रेपो के बारे में बात कर रहे हैं पर निर्भर करता है। गैर-नंगे रेपो के संदर्भ में, यह वर्तमान में चेक-आउट किए गए कमिट को प्रभावी रूप से संदर्भित करता है, जिसके लिए इससे जुड़ी एक शाखा होने की आवश्यकता नहीं है (अर्थात जब अलग HEAD
राज्य में)।
एक शाखा वास्तव में एक संकेतक है जो एक प्रतिबद्ध आईडी रखती है जैसे कि 17a5 । HEAD उस ब्रांच का पॉइंटर है, जिस पर यूजर अभी काम कर रहा है।
HEAD में एक संदर्भ फाइल है जो इस तरह दिखता है:
संदर्भ:
आप इन फ़ाइलों की जाँच करके उन तक पहुँच .git/HEAD
.git/refs
सकते हैं जो आपके द्वारा काम कर रहे भंडार में हैं।
Git
सभी के बारे में है
और Head
उस कमिट को इंगित करता है जिसे आपने वर्तमान में चेक आउट किया है।
$ git cat-file -t HEAD
commit
जब भी आप किसी शाखा की जांच करते हैं, तो HEAD उस शाखा की नवीनतम प्रतिबद्ध की ओर इशारा करता है। HEAD की सामग्री नीचे (मास्टर शाखा के लिए) जाँच की जा सकती है:
$ cat .git/refs/heads/master
b089141cc8a7d89d606b2f7c15bfdc48640a8e25
एक अवधारणा के रूप में, हेड एक शाखा में नवीनतम संशोधन है। यदि आपके पास नामांकित शाखा के प्रति एक से अधिक सिर हैं, तो आपने संभवतः विलय के बिना स्थानीय कमिट करते समय इसे बनाया, प्रभावी रूप से एक अनाम शाखा का निर्माण।
"क्लीन" रिपॉजिटरी रखने के लिए, आपके पास नामित शाखा के प्रति एक सिर होना चाहिए और स्थानीय स्तर पर काम करने के बाद हमेशा एक नामित शाखा में विलय हो जाना चाहिए।
मर्क्यूरियल के लिए भी यह सही है ।