GAD में HEAD और ORIG_HEAD


253

इन प्रतीकों का क्या मतलब है और उनका क्या मतलब है?

(मुझे आधिकारिक दस्तावेज में कोई स्पष्टीकरण नहीं मिल सकता है)


4
नोट: HEADअब (आगामी git1.8.4) ' @' है! देखें नीचे मेरी संपादित जवाब
VonC

नोट-बिस: ' @' (के लिए HEAD) अभी भी आ रहा है, लेकिन संपादित और संशोधित 1.8.4 उत्तर के लिए नहीं ।
वॉन

1
ध्यान दें: ' @' HEADgit 1.8.5 / 1.9 के लिए वापस आ गया है। उत्तर फिर से संपादित किया गया
VonC

21
HEADऔर ORIG_HEADGit में $PWDऔर $OLDPWDबैश में हैं। :)
मुशीफिल

जवाबों:


324

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

और @अकेले के लिए एक शॉर्टकट है HEAD, Git 1.8.5 के बाद से

ORIG_HEADकी पिछली स्थिति है HEAD, जो संभवत: खतरनाक व्यवहार वाले आदेशों द्वारा निर्धारित की गई है, उन्हें वापस करना आसान है। यह अब कम उपयोगी नहीं है कि गिट ने रिफ्लॉग किया है: HEAD@{1}लगभग बराबर है ORIG_HEAD( HEAD@{1}यह हमेशा के अंतिम मूल्य है HEAD, खतरनाक ऑपरेशन ORIG_HEADसे HEADपहले अंतिम मूल्य है )।

अधिक जानकारी के लिए git (1) manpage , Git User's Manual , Git Community Book और Git Glossary पढ़ें


2
हाय जैकब। स्पष्टीकरण के लिए +1। क्या आप HEAD @ {1} के "लगभग समतुल्य" भाग का विस्तार कर सकते हैं? मैं थ्रेड थ्रेड के अपने उत्तर में उल्लेख करता हूं। gmane.org/gmane.comp.version-control.git/38379 (आप इसमें थे, फरवरी 2007 में वापस), और मुझे इस बात की बिलकुल समझ नहीं थी कि आप लोग आसपास थे। @ {...} सिंटैक्स।
VonC

19
ORIG_HEAD सेट है (मुझे लगता है) केवल 'खतरनाक' कमांड्स द्वारा, जो HEAD को एक से अधिक कमिट में ले जाते हैं। इसलिए ORIG_HEAD हमेशा सेट नहीं होता है, जबकि HEAD @ {1} हमेशा सेट होता है। @ {1} $ (git प्रतीकात्मक-रेफ HEAD) @ {1} है, अर्थात यह वर्तमान शाखा के लिए reflog का उपयोग करता है, HEAD reflog का नहीं।
जैकब नर

Riiight ... मुझे अब यह मिल गया है :) उस स्पष्टीकरण के लिए धन्यवाद। इसके लायक क्या है, मैंने आपकी टिप्पणी को भी गलत ठहराया है!
VonC

1
"और एचईएडी एक ऐसी प्रतिबद्धता है जिसके ऊपर" जीट कमिट "एक नया बना देगा।" - याद रखने के लिए अच्छा है, धन्यवाद! @VonC से भी, 'यह प्रतिबद्ध है "git कमिट" के शीर्ष पर बनाता है, और "git diff --cached" और "git स्टेटस" की तुलना करता है।'
मिनकी पैन

1
Git मदद संशोधन को लाता है git-scm.com/docs/gitrevisions है, जो (सहित संदर्भ प्रतिबद्ध करने के लिए सभी तरह से वर्णन करता है HEADऔर ORIG_HEAD)।
डेहलबीक

104

से Git रीसेट

"पुल" या "मर्ज" हमेशा वर्तमान शाखा के मूल टिप को अंदर छोड़ता है ORIG_HEAD

git reset --hard ORIG_HEAD

इसे कड़ी मेहनत से रीसेट करने से आपकी अनुक्रमणिका फ़ाइल और काम करने वाला पेड़ वापस उसी अवस्था में आ जाता है, और शाखा की नोक को उस कमिट में रीसेट कर देता है।

git reset --merge ORIG_HEAD

मर्ज के परिणाम का निरीक्षण करने के बाद, आप पा सकते हैं कि दूसरी शाखा में परिवर्तन असंतोषजनक है। रनिंग " git reset --hard ORIG_HEAD" आपको वापस वहीं जाने देगा जहां आप थे, लेकिन यह आपके स्थानीय परिवर्तनों को छोड़ देगा, जो आप नहीं चाहते हैं। " git reset --merge" आपके स्थानीय परिवर्तन रखता है।


किसी भी पैच को लागू करने से पहले, ORIG_HEAD को वर्तमान शाखा के सिरे पर सेट किया जाता है।
यदि आप git amगलत तरीके से शाखा पर ' ' चल रहे हैं या कमिट में कोई त्रुटि है जो मेलबॉक्स को परिवर्तित करके अधिक आसानी से तय की जाती है (जैसे "से:" पंक्तियों में)।

इसके अलावा, मर्ज हमेशा .git/ORIG_HEADHEAD की मूल स्थिति में ' ' सेट करता है इसलिए ' git reset ORIG_HEAD' का उपयोग करके एक समस्याग्रस्त मर्ज को हटाया जा सकता है ।


नोट: यहाँ से

HEAD एक मूविंग पॉइंटर है। कभी-कभी इसका मतलब वर्तमान शाखा होता है, कभी-कभी यह नहीं होता है।

तो HEAD पहले से ही हर जगह "वर्तमान शाखा" का पर्याय नहीं है।

HEAD का अर्थ होता है " git " हर जगह git में, लेकिन इसका मतलब जरूरी नहीं है कि "current branch" (यानी अलग किया गया HEAD)।

लेकिन यह लगभग हमेशा "वर्तमान प्रतिबद्ध" का मतलब है।
यह " git commit" के शीर्ष पर बनाता है, और " git diff --cached" और " git status" के खिलाफ तुलना करता है।
इसका अर्थ है कि वर्तमान शाखा का अर्थ केवल बहुत सीमित संदर्भों में है (ठीक उसी समय जब हम एक शाखा का नाम संचालित करना चाहते हैं --- कमिट / रिबेस / आदि के माध्यम से शाखा टिप को रीसेट करना और बढ़ाना।)।

Reflog समय में वापस जाने के लिए एक वाहन है और समय मशीनों में "वर्तमान" की धारणा के साथ दिलचस्प बातचीत होती है।

HEAD@{5.minutes.ago}इसका मतलब हो सकता है "घबराहट HEAD सहानुभूति यह जानने के लिए कि हम अभी किस शाखा में हैं, और फिर पता करें कि उस शाखा का सिरा 5 मिनट पहले कहां था"।
वैकल्पिक रूप से इसका मतलब यह हो सकता है "5 मिनट पहले के रूप में मुझे उल्लिखित किया गया प्रतिबद्ध क्या होता है, उदाहरण के लिए अगर मैंने" वापस "जीआईटी शो" किया था "।


git1.8.4 (जुलाई 2013) द्वारा प्रस्तुत एक नई अधिसूचना शुरू की !
(वास्तव में, यह 1.8.5 या 1.9, Q4 2013 के लिए होगा: प्रतिबद्ध 9ba89f4 के साथ पुन: प्रस्तुत किया गया )

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

देखें प्रतिबद्ध cdfd948

टाइपिंग ' HEAD' थकाऊ है, खासकर जब हम @इसके बजाय ' ' का उपयोग कर सकते हैं ।

' @' को चुनने का कारण यह है कि यह ref@opसिंटैक्स (जैसे HEAD@{u}) से स्वाभाविक रूप से अनुसरण करता है , सिवाय इसके कि हमारे पास कोई रेफरी और कोई ऑपरेशन नहीं है, और जब हमारे पास नहीं है, तो यह ' HEAD' मानने के लिए समझ में आता है ।

तो अब हम ' git show @~1' का उपयोग कर सकते हैं , और यह सब अच्छाई है।

अब तक ' @' एक मान्य नाम था, लेकिन यह इस विचार से टकराता है, तो चलिए इसे अमान्य बना देते हैं। शायद बहुत कम लोगों ने, यदि कोई हो, तो इस नाम का इस्तेमाल किया।


1.8.4-आरसी 3 अवधि (14, अगस्त 2013) के दौरान एक ब्लॉग पोस्ट ने घोषणा की कि यह सुविधा वापस ले ली गई और देरी हुई ( हेड-अप के लिए धन्यवाद कपकेक )। दोबारा, इसे फिर से 9ba89f4 (सितंबर 2013) के साथ पेश किया गया है ।

देखें 2c2b664 प्रतिबद्ध :

"नया @शॉर्टकट जोड़ें HEAD"

यह श्रद्धा cdfd948 के लिए प्रतिबद्ध है , क्योंकि यह सिर्फ " @" पर लागू नहीं होता है (और @{u}इसे लागू किए गए जैसे संशोधक के साथ रूपों ), लेकिन यह भी जैसे " refs/heads/@/foo" को प्रभावित करता है , जो इसे नहीं करना चाहिए।

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


चलाने के बाद रीसेट रीसेट ORIG_HEAD और कमिट करें। ORIG_HEAD अभी भी HEAD के बगल में संदर्भ के तहत है। इसे देखने से क्यों नहीं हटाया गया?
पाउडर 366

@ पाउडर 366 लेकिन एक git resetउत्पन्न करेगा ORIG_HEAD। तो आपको rmइसे मैन्युअल रूप से करने की आवश्यकता है । उदाहरण के लिए stackoverflow.com/a/12418078/6309 देखें ।
वॉन

1
@VonC के लिए @उपनाम (अस्थायी रूप से?) Git 1.8.4 रिलीज के लिए वापस कियाHEAD जा रहा है ! आज ही घोषित किया गया था!

"हेड-अप" टिप्पणी का आनंद लिया!
रॉबिनो

2

मेरी समझ यह है कि HEAD वर्तमान शाखा को इंगित करता है, जबकि ORIG_HEAD का उपयोग "खतरनाक" संचालन करने से पहले पिछले HEAD को संग्रहीत करने के लिए किया जाता है।

उदाहरण के लिए git-rebase और git-am किसी भी परिवर्तन को लागू करने से पहले शाखा की मूल टिप रिकॉर्ड करते हैं।


4
HEAD हमेशा वर्तमान शाखा पर इंगित नहीं करता है (इसे अलग किया जा सकता है)
VonC

1
तो "चालू शाखा" क्या है जब HEAD को "अलग किया गया?"
cjs

@ कर्टज.सम्पसन "नो ब्रांच" है। इसीलिए जब आप सिर को अलग करते हैं, तो आप git branch foo -bउस अनाथ के लिए एक शाखा "बनाने" के लिए करते हैं।
रॉय नमिर

1

से man 7 gitrevisions:

HEAD उस कमेटी का नाम देता है, जिसके आधार पर आपने वर्किंग ट्री में बदलाव किए हैं। FETCH_HEAD उस शाखा को रिकॉर्ड करता है जिसे आपने अपने अंतिम git लाने के लिए दूरस्थ रिपॉजिटरी से मंगवाया था। ORIG_HEAD उन कमांड द्वारा बनाया जाता है जो आपके HEAD को बड़े पैमाने पर स्थानांतरित करते हैं, उनके ऑपरेशन से पहले HEAD की स्थिति को रिकॉर्ड करने के लिए, ताकि आप शाखा के सिरे को आसानी से राज्य में वापस ला सकें, इससे पहले कि आप उन्हें चलाएं। MERGE_HEAD कमिट (s) रिकॉर्ड करता है जिसे आप अपनी शाखा में मर्ज कर रहे हैं जब आप git मर्ज चलाते हैं। CHERRY_PICK_HEAD वह कमिट रिकॉर्ड करता है जिसे आप चेरी-पिक चलाने पर चेरी-पिकिंग करते हैं।

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