Git प्रतिबद्ध श्रेणियों में डबल-डॉट ".." और ट्रिपल-डॉट "..." के बीच अंतर क्या हैं?


412

कुछ Git कमांड कमिट रेंज लेती हैं और एक वैध सिंटैक्स दो डॉट्स के साथ दो कमिट नामों को अलग करने के लिए है .., और एक अन्य सिंटैक्स तीन डॉट्स का उपयोग करता है ...

दोनों में क्या मतभेद हैं?


जवाबों:


251

यह इस बात पर निर्भर करता है कि आप logकमांड का उपयोग कर रहे हैं या diffकमांड का। में logमामला है, क्या है man git-rev-parseप्रलेखन:

एक कमिट से आने वाले कमिट्स को बाहर करने के लिए, एक उपसर्ग ^ नोटेशन का उपयोग किया जाता है। जैसे ^ r1 r2 का अर्थ है r2 से पहुंच योग्य है, लेकिन r1 से पहुंचने वाले को बाहर करें।

यह सेट ऑपरेशन इतनी बार दिखाई देता है कि इसके लिए एक आशुलिपि है। जब आपके पास दो कम् r1 और r2 हैं (ऊपर दिए गए विनिर्देशनों में बताए गए सिंटैक्स के अनुसार नाम दिया गया है), तो आप उन रस्मों के लिए पूछ सकते हैं जो r2 से पहुंच योग्य हैं, जिन्हें r1 से "r1 r2" से पढ़ कर बाहर रखा जा सकता है और इसे लिखा जा सकता है। "r1..r2"।

एक समान संकेतन "आर 1 ... आर 2" को आर 1 और आर 2 का सममित अंतर कहा जाता है और इसे "आर 1 आर 2 - नॉट $ (गिट मर्ज-बेस - आर 1 आर 2)" के रूप में परिभाषित किया गया है। यह कमिट्स का एक सेट है जो आर 1 या आर 2 में से किसी एक से पहुंच योग्य है लेकिन दोनों से नहीं।

जो मूल रूप से इसका मतलब है कि आपको सभी कमिट मिलेंगे जो दोनों शाखाओं में से किसी एक में हैं, लेकिन दोनों में नहीं।

में diffमामला है, क्या है man git-diffप्रलेखन:

  git diff [--options] <commit>...<commit> [--] [<path>...]

      This form is to view the changes on the branch containing and up to
      the second <commit>, starting at a common ancestor of both
      <commit>. "git diff A...B" is equivalent to "git diff
      $(git-merge-base A B) B". You can omit any one of <commit>, which
      has the same effect as using HEAD instead.

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

..कुछ हद तक सरल है: में git-diffमामला है, यह एक के रूप में ही है git diff A Bऔर सिर्फ बी के खिलाफ एक diffs में logमामला है, यह सब करता है कि ए में नहीं बी में हैं, लेकिन पता चलता


31
यह बहुत ही हास्यास्पद है कि इसका अर्थ ..और ...लॉग के लिए बिल्कुल अदला-बदली है और log A..Bमर्ज के आधार से बी में परिवर्तन होता है जो कि क्या diff A...Bहोता है
phiresky

1
@phiresky हाँ, यह वास्तव में खराब प्रयोज्य है। मैं अनुशंसा करता हूं कि इसके लिए डॉट नोटेशन का उपयोग न करें git diff
वारबैंक

2
क्या इसका मतलब A...B== है A..B + B..A?
दानोन

2
@ इसके लिए डैनॉन git logबिल्कुल हाँ है
maoizm

659

Git Log के साथ कमिट रेंज का उपयोग करना

जब आप की तरह पर्वतमाला प्रतिबद्ध प्रयोग कर रहे हैं ..और ...साथ git log, उन दोनों के बीच अंतर यह है कि है, शाखाओं ए और बी के लिए,

git log A..B

आप सभी को दिखाएगा कि B के पास A है , जबकि ऐसा नहीं है

git log A...B

आप दोनों को दिखाएंगे कि A के पास A है और B के पास नहीं है, और जो B के पास A है, या दूसरे शब्दों में वह कमिट करता है, जो सभी ए और बी दोनों को साझा करता है, इस प्रकार केवल यह दर्शाता है कि वे दोनों साझा नहीं करते हैं

वेन आरेख और प्रतिबद्ध पेड़ों के साथ दृश्य

यहाँ का एक दृश्य प्रतिनिधित्व है git log A..B। उस शाखा B में मौजूद कमिट्स में A मौजूद नहीं है, जो कमिट रेंज द्वारा लौटाया गया है, और वेन आरेख में लाल रंग में हाइलाइट किया गया है, और कमिट ट्री में नीले रंग में परिक्रमा की गई है:

 "git log A..B" आरेखवृक्ष १

ये के लिए आरेख हैं git log A...B। ध्यान दें कि दोनों शाखाओं द्वारा साझा किए गए कमिट्स कमांड द्वारा वापस नहीं किए जाते हैं:

 "गिट लॉग ए ... बी" आरेखवृक्ष २

ट्रिपल-डॉट कमिट रेंज को ...अधिक उपयोगी बनाना

आप ...लॉग-इन कमांड में ट्रिपल-डॉट कमिट को अधिक उपयोगी बना सकते हैं, --left-rightयह दिखाने के लिए कि कौन सी शाखा से संबंधित हैं , विकल्प का उपयोग करके :

$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt

उपरोक्त आउटपुट में, आप उन कमिटों को देखेंगे जो masterपूर्व से जुड़े हुए हैं <, जबकि यह कहता है कि origin/masterवे पहले से जुड़े हुए हैं >

जीआईटी डिफ के साथ कमिट रेंज का उपयोग करना

किसी दिन मैं अपनी व्याख्या जोड़ सकता हूं कि प्रतिबद्ध सीमाएं किस तरह से काम करती हैं git diff, लेकिन अब के लिए, आप यह जांचना चाहेंगे कि डबल-डॉट ".." और ट्रिपल-डॉट "..." के बीच क्या अंतर है। पर्वतमाला?

यह सभी देखें


35
यह उत्तर वास्तव में संक्षिप्त पाठ, उदाहरण और चित्रों के साथ अंतर की व्याख्या करता है। मुझे यह वर्तमान में शीर्ष वोट किए गए उत्तर की तुलना में बहुत अच्छा लगा, जो अस्पष्ट दस्तावेज को उद्धृत करता है। (tl; इस जवाब के लिए धन्यवाद मैं वास्तव में अंतर को समझता हूं।)
एरिक

4
@Cupcake क्या अर्थ निकाल सकता है ... git diff में?
मारियस

1
@ मार्स वास्तव में, अब जब आप इसे लाएंगे, तो मैं आगे जाऊंगा और अपने उत्तर में उस अन्य प्रश्न को अपने जैसे भविष्य के पाठकों के लिए लिंक करूंगा।

2
क्या यह वास्तव में विपरीत नहीं है? डिग डिफ ए..बी ऑल डिफरेंस है, या मूल रूप से गिट ए बी के समान है। जबकि git dif a ... b केवल चेंजिंग च के बाद से किए गए परिवर्तन b है।
वेज्रोवस्की

2
कम से कम गिट लॉग के लिए। Git diff के लिए शायद चीजें उलट दी जाएं: stackoverflow.com/questions/7251477/…
बेंजामिन एटकिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.