गिट में सिर क्या है?


232

ऐसा लगता है कि अंतिम प्रतिबद्ध, HEAD और फ़ाइल की स्थिति के बीच अंतर है जो मैं अपनी निर्देशिका में देख सकता हूं।

HEAD क्या है, मैं इसके साथ क्या कर सकता हूं और मुझे किस गलती से बचना चाहिए?



1
Git v1.8.4 के साथ शुरू, उस उपयोग के नीचे सभी उत्तर HEADया headअब इसके @स्थान पर उपयोग कर सकते हैं HEADयह जानने के लिए कि आप ऐसा क्यों कर सकते हैं, यह उत्तर (अंतिम खंड) देखें ।

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

जवाबों:


185

HEAD वर्तमान में चेक-आउट शाखा में अंतिम प्रतिबद्ध का संदर्भ है।


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


1
तो आपके दो सिर क्यों हो सकते हैं?
ई-सतीस

1
@ ई-सतीस: कभी-कभी आप देखेंगे कि शाखाओं को सिर के रूप में संदर्भित किया जाता है - वे अंदर संग्रहीत होते हैं refs/heads। लोअर-केस हेड से अलग है HEAD, हालांकि। मेरा जवाब यह थोड़ा स्पष्ट करता है।
Cascabel

7
@ ई-सटिस: यह रेगेक्स नहीं है। ^बात यह है कि वर्तमान एक से पहले प्रतिबद्ध - के लिए "से पहले प्रतिबद्ध" सिर्फ Git के संकेतन है। (यदि धारा एक मर्ज है, तो यह पहले माता-पिता का उपयोग करता है।)
कास्कबेल

1
@ ई-सिटिस: कमिट निर्दिष्ट करने के सभी तरीकों के बारे में अधिक जानकारी के लिए आदमी पृष्ठ के निर्दिष्ट संशोधन अनुभाग देखें - यह सिर्फ एक छोटा सा टुकड़ा है। kernel.org/pub/software/scm/git/docs/…
Cascabel

1
नहीं, जब रेव और HEAD एक ही कमिट की ओर इशारा कर रहे हैं, तो कोई अंतर नहीं है। और आप संशोधित या HEAD के बजाय प्रतिबद्ध आईडी (SHA-1 मान) भी लिख सकते हैं। और चिंता न करें, यदि आप प्रश्न :) के साथ हमें तंग मत करो (मुझे कम से कम: पी)
प्रहार

87

HEAD वर्तमान में चेक किए गए कमिट के लिए एक संदर्भ (संदर्भ) है।

सामान्य स्थिति में, यह वास्तव में आपके द्वारा चेक की गई शाखा का एक प्रतीकात्मक रेफरी है - यदि आप .it / HEAD की सामग्री को देखते हैं तो आपको "Ref: refs / heads / master" जैसा कुछ दिखाई देगा। शाखा अपने आप में शाखा के सिरे पर एक संदर्भ है। इसलिए, सामान्य स्थिति में,HEAD प्रभावी रूप से वर्तमान शाखा की नोक पर प्रतिबद्ध को संदर्भित करता है।

यह भी संभव है कि एक "अलग हेड" हो। ऐसा तब होता है जब आप एक (स्थानीय) शाखा के अलावा एक दूरस्थ शाखा, एक विशिष्ट वचन या एक टैग के अलावा कुछ की जांच करते हैं। यह देखने के लिए सबसे आम जगह एक इंटरैक्टिव रिबेस के दौरान है, जब आप एक कमिट संपादित करने के लिए चुनते हैं। अलग राज्य में, आपका HEAD एक कमिट का सीधा संदर्भ है - .IT / HEAD की सामग्री SHA1 हैश होगी।

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


6
यह कुछ ऐसा है जो मुझे समझ में नहीं आता है। यदि आप एक दूरस्थ शाखा की जांच करते हैं, तो आप एक "अलग हेड" के साथ क्यों समाप्त होते हैं। आप अपने स्थानीय रेपो में शाखा में स्वचालित रूप से क्यों नहीं कूदते हैं जो आपके रिमोट से मेल खाता है?
ई-सतीस

3
@ ई-सटिस: यदि आप स्थानीय शाखा चाहते हैं, तो स्थानीय शाखा देखें। याद रखें कि दोनों एक समान नहीं हैं - आपको दूरस्थ एक (या पुल) को मर्ज करने के लिए स्थानीय को बताना होगा। ट्रैकिंग बस इतना है कि यह जानता है कि आपके पूछने पर कौन सा स्वचालित रूप से खींच सकता है। इसका कारण यह है कि दूरस्थ शाखा दूरदराज के रेपो में शाखा के अंतिम स्थान के लिए एक संकेतक होने का इरादा रखती है। यदि आप इसे करने की कोशिश करते हैं, तो रिमोट रेपो नहीं बदलता है, इसलिए दूरस्थ शाखा या तो नहीं होनी चाहिए।
कास्कैबेल

1
ठीक है, यह वही है जो मुझे नहीं मिला: एक स्थानीय शाखा का नाम एक तरह से होने का मतलब यह नहीं है कि यह रिमोट के समान है। वास्तव में शुरुआत में मुझे एसवीएन पृष्ठभूमि से आने के कारण मुश्किल है :-) धन्यवाद आदमी। BTW, आप इसे करने के लिए एक स्थानीय शाखा में एक हेडलेस हेड कैसे ले जाते हैं?
ई-सतीस

3
@ ई-सतीस: सामान्य उत्तर है git rebase <branch> HEAD। इस के अंतिम सामान्य पूर्वज मिलेगा <branch>और HEAD, और तब सभी प्रतिबद्ध करने के लिए वहाँ से ले HEADपर (उन्हें rebase) और उन्हें लागू <branch>। यह अनिवार्य रूप से उन्हें पैच के रूप में लागू करके करता है, इसलिए यदि दोनों शाखाएं वास्तव में अलग हैं, तो संघर्ष हो सकता है। लेकिन अगर <branch>आप का पूर्वज HEAD(यानी आप सही जगह पर थे, तो आप भूल गए थे कि छूट दी गई है HEAD) रिबास सिर्फ एक फास्ट-फॉरवर्ड मर्ज है।
कास्कैबेल

3
यह कुछ समय के लिए खोज के बाद, मैंने देखा है कि गिट हेड के सबसे स्पष्ट और सटीक विवरणों में से एक है।
लार्स

21

मैंने हमेशा सोचा था HEAD~5कि 5 से पहले GO का मतलब है। लेकिन यह कमांड के GO भाग को नहीं ले जाता है। यह केवल संदर्भ / 'जहां' भाग के लिए किया जाता है कमांड का है।

आम शब्दों में, इसका उपयोग इस सवाल का जवाब देने के लिए किया जाता है: मुझे कहाँ जाना चाहिए? किसके लिए प्रतिबद्ध?

  • HEAD (वर्तमान संदर्भ के लिए) का मतलब है
  • HEAD~1 का अर्थ है (1 के संदर्भ में) से पहले
  • HEAD~ ALSO का मतलब (संदर्भ) 1 से पहले का है
  • HEAD~87 का मतलब (संदर्भ) 87 से पहले आता है

उपयोग:

  • git checkout HEAD~1 इससे पहले वास्तव में 1 प्रतिबद्ध / संदर्भ के लिए GO / चेकआउट होगा
  • git reset HEAD~3 आपके पिछले 3 कमिट्स को हटा देगा - बदलावों को हटाए बिना, यानी आप पिछले 3 कमिट्स में किए गए सभी बदलावों को एक साथ देख सकते हैं, जो कुछ भी आपको पसंद नहीं है उसे हटा दें या फिर उस पर फिर से काम करें।
  • git reset --hard HEAD~3अपने पिछले प्रतिबद्ध uncommit जाएगा और उनके परिवर्तनों को निकालने । यह उन परिवर्तनों को पूरी तरह से हटा देगा। अधिक जानकारी के लिए यहां देखें
  • git diff HEAD~3 अंतिम 3 में परिवर्तनों की जाँच के लिए

3
अपने स्वयं के उत्तर पर वापस आ रहा हूं :)
हनी

15

GIT में HEAD पॉइंटर

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

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

मुझे लगता है कि इस बारे में सोचने के लिए एक अच्छा रूपक एक कैसेट टेप रिकॉर्डर पर प्लेबैक और रिकॉर्ड सिर है। जैसा कि हम ऑडियो रिकॉर्ड करना शुरू करते हैं, टेप सिर से आगे बढ़ता है, और यह उस पर रिकॉर्ड करता है। जब हम प्रेस करते हैं उस स्थान को रोकें जहां वह रिकॉर्ड सिर बंद है वह स्थान है जिसे हम फिर से रिकॉर्ड करना शुरू कर देंगे जब हम रिकॉर्ड को दूसरी बार दबाते हैं। अब हम चारों ओर घूम सकते हैं, हम सिर को विभिन्न स्थानों पर स्थानांतरित कर सकते हैं, लेकिन जहां भी सिर तैनात है जब हम रिकॉर्ड को फिर से हिट करते हैं तो यह रिकॉर्डिंग शुरू करने जा रहा है।

Git में HEAD पॉइंटर बहुत समान है, यह उस स्थान पर इंगित करता है जहां हम अगले रिकॉर्डिंग शुरू करने जा रहे हैं। यह वह जगह है जहां हमने अपने भंडार में उन चीजों के लिए छोड़ दिया है जो हमने प्रतिबद्ध हैं।


0

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

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

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

cat .git/HEAD

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

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