git with गिट में HEAD ^ और HEAD ~ के बीच क्या अंतर है?




integrate git bash with visual studio code (10)

सीधे शब्दों में कहें, पित्त के पहले स्तर (वंश, विरासत, वंशावली, आदि) के लिए HEAD ^ और HEAD ~ दोनों एक ही प्रतिबद्धता को इंगित करते हैं, जो हेड (प्रतिबद्ध) के ऊपर एक माता-पिता (स्थित) है।

इसके अलावा, HEAD ^ = HEAD ^ 1 = HEAD ~ = HEAD ~ 1। लेकिन सिर ^^! = HEAD ^ 2! = HEAD ~ 2। फिर भी HEAD ^^ = HEAD ~ 2। पढ़ते रहिये।

माता-पिता के पहले स्तर से परे, चीजें कठिन हो जाती हैं, खासकर यदि कार्यरत शाखा / मास्टर शाखा में विलय हो गया है (अन्य शाखाओं से)। कैरेट के साथ वाक्यविन्यास का मामला भी है, HEAD ^^ = HEAD ~ 2 (वे बराबर हैं) लेकिन HEAD ^^! = HEAD ^ 2 (वे पूरी तरह से दो अलग-अलग चीजें हैं)।

प्रत्येक / कैरेट हेड के पहले माता-पिता को संदर्भित करता है, यही कारण है कि एक साथ स्ट्रिंग किए गए कैरेट टिल्ड एक्सप्रेशन के बराबर होते हैं, क्योंकि वे पहले माता-पिता (पहले माता-पिता) के पहले माता-पिता इत्यादि को संदर्भित करते हैं, जो जुड़े हुए कैरेट पर सख्ती से आधारित होते हैं। या टिल्डे के बाद की संख्या पर (या तो, दोनों का मतलब एक ही बात है), यानी पहले माता-पिता के साथ रहें और एक्स पीढ़ियों तक जाएं।

HEAD ~ 2 (या HEAD ^^) उस वचन को संदर्भित करता है जो पदानुक्रम में मौजूदा प्रतिबद्धता (HEAD) के ऊपर / ऊपर वंश के दो स्तर है, जिसका अर्थ है हेड के दादाजी प्रतिबद्धता।

दूसरी तरफ, HEAD ^ 2, पहले माता-पिता के दूसरे माता-पिता की प्रतिबद्धता को संदर्भित नहीं करता है, बल्कि केवल दूसरे माता-पिता की प्रतिबद्धता को संदर्भित करता है। इसका कारण यह है कि देखभाल का मतलब प्रतिबद्धता का अभिभावक है, और निम्नलिखित संख्या दर्शाती है कि कौन से / माता-पिता को प्रतिबद्ध किया जाता है (पहला माता-पिता, उस स्थिति में जब देखभाल का नंबर किसी संख्या के बाद नहीं होता है [क्योंकि यह संख्या के लिए शॉर्टेंड है 1 होना, जिसका मतलब पहला माता पिता है])। कैरेट के विपरीत, बाद में जो संख्या निम्नानुसार है, वह पदानुक्रम के ऊपर एक और स्तर का संकेत नहीं देती है, बल्कि यह दर्शाती है कि पदानुक्रम में कितने स्तर किनारे हैं, किसी को सही माता-पिता (प्रतिबद्ध) को खोजने की जरूरत है। एक टिल्ड अभिव्यक्ति में संख्या के विपरीत, यह पदानुक्रम में केवल एक अभिभावक है, भले ही नंबर (तत्काल) कैरेट आगे बढ़ रहा हो। ऊपर की तरफ, कैरेट की पिछली संख्या पदानुक्रम में माता-पिता के लिए किनारे की गणना करती है [माता-पिता के ऊपर एक स्तर पर जो लगातार कैरेट की संख्या के बराबर होती है]।

तो HEAD ^ 3 हेड प्रतिबद्ध के तीसरे माता-पिता के बराबर है (महान दादा नहीं, जो हेड ^^^ और HEAD ~ 3 होगा ...)।

जब मैं गिट में एक पूर्वज प्रतिबद्ध वस्तु निर्दिष्ट करता हूं, तो मैं HEAD^ और HEAD~ बीच उलझन में हूं।

दोनों में "क्रमांकित" संस्करण है जैसे HEAD^3 और HEAD~2

वे मेरे जैसे बहुत समान या समान प्रतीत होते हैं, लेकिन क्या टिल्डे और कैरेट के बीच कोई अंतर है?


सरलता से :

  • ~ पूर्वजों को निर्दिष्ट करता है
  • ^ माता-पिता को निर्दिष्ट करता है

विलय करते समय आप एक या अधिक शाखा निर्दिष्ट कर सकते हैं। फिर प्रतिबद्धता में दो या दो से अधिक माता-पिता होते हैं और फिर ^ माता-पिता को इंगित करने के लिए उपयोगी होता है।

मान लें कि आप शाखा ए पर हैं और आपके पास दो और शाखाएं हैं: बी और सी

प्रत्येक शाखा में तीन अंतिम प्रतिबद्धता क्रमशः हैं:

  • : ए 1 , ए 2 , ए 3
  • बी : बी 1 , बी 2 , बी 3
  • सी : सी 1 , सी 3 , सी 3

यदि अब शाखा ए पर आप कमांड निष्पादित करते हैं:

git merge B C

तो आप तीन शाखाओं को एक साथ जोड़ रहे हैं (यहां आपके विलय प्रतिबद्धता में तीन माता-पिता हैं)

तथा

~ पहले शाखा में n'th पूर्वजों को इंगित करता है, तो

  • HEAD~ ए 3 इंगित करता है
  • HEAD~2 HEAD~2 इंगित करता है
  • HEAD~3 HEAD~3 इंगित करता है

^ n'th माता-पिता को इंगित करता है, इसलिए

  • HEAD^ ए 3 इंगित करता है
  • HEAD^2 बी HEAD^2 इंगित करता है
  • HEAD^3 सी HEAD^3 इंगित करता है

एक दूसरे के बगल में ~ या ^ का अगला उपयोग, पिछले पात्रों द्वारा निर्दिष्ट प्रतिबद्धता के संदर्भ में है।

नोटिस 1 :

  • HEAD~3 हमेशा बराबर होता है: HEAD~~~ और: HEAD^^^ (प्रत्येक ए 1 इंगित करता है)

और आम तौर पर :

  • HEAD~n हमेशा बराबर होता है: HEAD~...~ ( n times ~ ) और to: HEAD^...^ ( n times ^ )।

नोटिस 2 :

  • HEAD^3 HEAD^^^ जैसा नहीं है (पहला सी 3 इंगित करता है और दूसरा ए 1 इंगित करता है)

और आम तौर पर :

  • HEAD^1 जैसा ही है,
  • लेकिन n > 1 के लिए: HEAD^n हमेशा HEAD^n जैसा नहीं है HEAD^...^ ( n times ~ )।

HEAD ^^^ HEAD ~ 3 के समान है, HEAD से पहले तीसरी प्रतिबद्धता का चयन करना

हेड ^ 2 मर्ज प्रतिबद्धता में दूसरे सिर को निर्दिष्ट करता है


TLDR

~ वह है जो आप अधिकतर समय चाहते हैं, यह संदर्भ वर्तमान शाखा में करता है

^ संदर्भ माता-पिता (गिट-विलय दूसरे माता-पिता या अधिक बनाता है)

ए ~ हमेशा ए ^ के समान होता है
ए ~~ हमेशा एक ^^ के समान होता है, और इसी तरह
ए ~ 2 ए ^ 2 जैसा नहीं है, हालांकि,
क्योंकि ~ 2 ~~ के लिए शॉर्टेंड है
जबकि ^ 2 किसी भी चीज़ के लिए शॉर्टेंड नहीं है, इसका मतलब है दूसरा माता-पिता


^<n> प्रारूप आपको प्रतिबद्धता के nth पैरेंट (विलय में प्रासंगिक) चुनने की अनुमति देता है। ~<n> प्रारूप आपको पहले माता-पिता का पालन करने के लिए, पूर्व पूर्वज प्रतिबद्धता का चयन करने की अनुमति देता है। कुछ उदाहरणों के लिए git-rev-parse के दस्तावेज़ देखें।


HEAD^ और HEAD~ बीच का अंतर http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html पर मिले चित्रण (जॉन लोलेगर द्वारा) द्वारा वर्णित है।

यह दस्तावेज शुरुआती लोगों के लिए थोड़ा अस्पष्ट हो सकता है इसलिए मैंने नीचे दिया गया चित्रण पुन: प्रस्तुत किया है:

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A
A =      = A^0
B = A^   = A^1     = A~1
C = A^2  = A^2
D = A^^  = A^1^1   = A~2
E = B^2  = A^^2
F = B^3  = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2  = B^^2    = A^^^2  = A~2^2
I = F^   = B^3^    = A^^3^
J = F^2  = B^3^2   = A^^3^2

HEAD^ मतलब वर्तमान शाखा की नोक का पहला अभिभावक है।

याद रखें कि गिट में एक से अधिक माता-पिता हो सकते हैं। HEAD^ HEAD^1 लिए छोटा है, और आप HEAD^2 को भी संबोधित कर सकते हैं और इसी तरह उचित पर भी।

आप केवल किसी भी प्रतिबद्धता के माता-पिता के पास नहीं जा सकते हैं। आप पीढ़ियों के माध्यम से वापस भी जा सकते हैं: उदाहरण के लिए, master~2 मतलब मास्टर शाखा की नोक का दादा है, अस्पष्टता के मामलों में पहले माता-पिता का पक्ष लेना। इन विनिर्देशों को मनमाने ढंग से जंजीरित किया जा सकता है, उदाहरण के लिए , topic~3^2

पूर्ण विवरण के लिए, git rev-parse दस्तावेज़ में "संशोधन निर्दिष्ट करना" देखें।

विचार के दृश्य प्रतिनिधित्व के लिए प्रलेखन का हिस्सा उद्धृत करें:

जॉन लोलेगर द्वारा यहां एक उदाहरण दिया गया है। दोनों प्रतिबद्ध नोड्स बी और सी प्रतिबद्ध नोड ए के माता-पिता हैं। माता-पिता के कामों को बाएं से दाएं आदेश दिया जाता है।

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A

A =      = A^0
B = A^   = A^1     = A~1
C = A^2  = A^2
D = A^^  = A^1^1   = A~2
E = B^2  = A^^2
F = B^3  = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2  = B^^2    = A^^^2  = A~2^2
I = F^   = B^3^    = A^^3^
J = F^2  = B^3^2   = A^^3^2

http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde से वर्बैटिम लिया गया एक बहुत अच्छा स्पष्टीकरण यहां दिया गया है:

ref~ ref~1 लिए ref~1 और इसका मतलब है प्रतिबद्ध का पहला माता-पिता। ref~2 अर्थ है प्रतिबद्धता के पहले माता-पिता के पहले माता-पिता। ref~3 अर्थ है प्रतिबद्धता के पहले माता-पिता के पहले माता-पिता के पहले माता-पिता। और इसी तरह।

ref^ ref^1 लिए ref^1 और इसका मतलब है प्रतिबद्ध का पहला माता-पिता। लेकिन जहां दोनों अलग हैं कि ref^2 अर्थ है प्रतिबद्धता का दूसरा माता-पिता (याद रखें, जब वे विलय होते हैं तो दो माता-पिता के पास हो सकता है)।

^ और ~ ऑपरेटरों को जोड़ा जा सकता है।


मेरे दो सेंट...


  • HEAD ~ "शाखा" पर पहले माता-पिता को निर्दिष्ट करता है

  • HEAD ^ आपको प्रतिबद्धता के विशिष्ट अभिभावक का चयन करने की अनुमति देता है

एक उदाहरण:

यदि आप एक साइड शाखा का पालन करना चाहते हैं, तो आपको कुछ निर्दिष्ट करना होगा

master~209^2~15




git