Git में अलग-अलग सीमा रेखाओं में डबल-डॉट ".." और ट्रिपल-डॉट "..." के बीच अंतर क्या हैं?


188

निम्नलिखित आदेशों के बीच अंतर क्या हैं ?:

git diff foo master   # a 
git diff foo..master  # b
git diff foo...master # c

मैनुअल इसके बारे में बात करता है:

तुलना करने वाली शाखाएँ

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. विषय और मास्टर शाखाओं के सुझावों के बीच परिवर्तन।
  2. ऊपर की तरह।
  3. मास्टर ब्रांच में तब से बदलाव आ रहा है जब विषय शाखा शुरू की गई थी।

लेकिन मेरे लिए पूरी तरह से स्पष्ट नहीं है।


जबकि प्रश्न एक नकली नहीं है, इस जवाब से पता चलता है रेखांकन के अर्थ ..और ...में git diffऔर में अपनी अलग अर्थ git log
मार्क लॉन्गेयर

जवाबों:


333

चूँकि मैंने पहले से ही इन छवियों को बनाया है, मुझे लगा कि यह उनके लिए एक और उत्तर में उपयोग करने लायक हो सकता है, हालाँकि ..(डॉट-डॉट) और ...(डॉट-डॉट-डॉट) के बीच अंतर का वर्णन अनिवार्य रूप से मनोजर्स के उत्तर के समान ही है ।

कमांड git diffआमतौर पर केवल आपको पेड़ के राज्यों के बीच कमिट पॉइंट में दो बिंदुओं के बीच का अंतर दिखाता है। ..और ...में अंकन git diffनिम्नलिखित अर्थ है:

गिट अंतर के लिए निर्दिष्ट करने के विभिन्न तरीकों का एक चित्रण है

दूसरे शब्दों में, git diff foo..barबिल्कुल वैसा ही है git diff foo bar; दोनों आप दो शाखाओं के सुझावों के बीच अंतर दिखाई देगा fooऔर bar। दूसरी ओर, git diff foo...barआपको दो शाखाओं के "मर्ज बेस" और टिप के बीच का अंतर दिखाएगा bar। "मर्ज का आधार" आम तौर पर उन दो शाखाओं के बीच सामान्य रूप से अंतिम प्रतिबद्ध होता है, इसलिए यह कमांड आपको उन परिवर्तनों को दिखाएगा जो आपके काम barको पेश किए गए हैं, जबकि उस समय में किए गए सभी चीजों को अनदेखा कर fooरहे हैं।

आप सभी के बारे में पता करने की जरूरत है ..और में ...सूचनाएं git diff। तथापि...


... यहाँ भ्रम का एक आम स्रोत है ..और ...इसका मतलब यह है कि जब एक आदेश में उपयोग किया जाता है git logकि एक या अधिक तर्क के रूप में एक सेट की उम्मीद है जैसे अलग अलग चीजों का मतलब है। (ये सभी git rev-listअपने तर्कों से कमिट की सूची का उपयोग करने के लिए आदेश देते हैं।)

का अर्थ ..और उसके ...लिए git logनीचे दिए अनुसार रेखांकन दिखाया जा सकता है:

गिट लॉग के लिए कमिट की श्रेणियों को निर्दिष्ट करने के विभिन्न तरीकों का चित्रण

तो, git rev-list foo..barआपको शाखा पर barवह सब कुछ दिखाता है जो शाखा पर नहीं है foo। दूसरी ओर, git rev-list foo...barआपको उन सभी कमिटों को दिखाता है जो foo या तो हैं bar, लेकिन दोनों में नहीं । तीसरा आरेख केवल यह दर्शाता है कि यदि आप दो शाखाओं को सूचीबद्ध करते हैं, तो आपको वे कमिट मिलते हैं जो एक या दोनों में हैं।

खैर, मुझे लगता है कि सब थोड़ा भ्रमित, वैसे भी, और मुझे लगता है कि प्रतिबद्ध ग्राफ चित्र मदद :)

Mer मैं केवल "आम तौर पर" कहता हूं जब से मर्ज संघर्षों को हल करता है, उदाहरण के लिए, git diffआपको तीन-तरफा मर्ज दिखाएगा।


1
मुझे आपके चित्र पसंद हैं। मैं थोड़ी देर पहले भी अपने साथ आई थी । मेरे पास अपने स्वयं के git diffआरेखों के लिए कुछ विचार हैं जो मैं बाद में बनाऊंगा।

34
किसी ने नोटिस किया? के प्रभाव ..और ...महसूस उलट में git diff(की तुलना में git rev-list)!
रॉबर्ट सिएमर

2
आपने मुझे "वह सब आपको जानना आवश्यक है [...]। हालांकि ..."। :-) गिट ऐसी चीजों से भरा है जहां समान संकेतन और शब्दावली का अर्थ अलग-अलग संदर्भों में अलग-अलग चीजों से है; यह इतनी अच्छी तरह से स्पष्ट करने के लिए धन्यवाद।
श्रीवत्सआर

रि-लिस्ट का उल्लेख करने के लिए धन्यवाद। रेव-पार्स के माध्यम से रि-लिस्ट क्या करता है, यह करने के तरीके की तलाश में मैं इस सवाल पर आया था।
मैड फिजिसिस्ट

"दूसरे शब्दों में, git diff foo..barबिल्कुल वैसा ही है git diff foo bar, दोनों आपको दो शाखाओं फू और बार के सुझावों के बीच का अंतर दिखाएंगे।" "दो शाखाओं के सुझावों के बीच अंतर" से वास्तव में आपका क्या अभिप्राय है?
असद मूसवी

60

मेरा बनाम का समेकित संस्करण .. भिन्न लॉग के साथ ... बनाम

डिफ बनाम लॉग और .. बनाम।


3
यह बहुत अच्छा होगा, यदि केवल इसमें इतने सारे अलग-अलग रंग न हों और सेट अप ऑपरेशंस ../ ...सामान को एक साथ मिला दिया जाए । उदाहरण के लिए, log A...Bयह स्पष्ट नहीं है कि कमांड प्रतिच्छेदन (आरेख का सफेद हिस्सा) या बाकी एबी संघ (हरा) वापस करता है या नहीं। यह बिना किसी सेट ऑपरेंड और केवल 1 रंग के साथ बिंदु पर अधिक होगा।
xealits

1
क्या यह वास्तव में होना चाहिए diff A..B<-> log A...B, जो वास्तव में 2 डॉट्स के साथ भिन्न होता है, 3 (!) डॉट्स के साथ लॉग करने के लिए अनुरूप है ? या इमेज में कोई टाइपो है। डॉट्स को कलर कोडेड कैसे किया जाता है, इसे देखते हुए मुझे लगता है कि इमेज में एक टाइपो है। निचले बाएं कोने: सही, (?) log A...Bहोना चाहिए log A..B। और सही करने के लिए लॉग इन... नहीं होना चाहिए ..
काजगामनस

1
हाय डॉल्फिनड्रीम, आपके आंकड़े के लिए धन्यवाद। मैं इसे यहाँ संदर्भ के रूप में उपयोग करता हूं: gitlab.com/tortoisegit/tortoisegit/issues/3427#note_227200695
यू लिन हो

1
@KajMagnus वास्तव में लाल / नीले रंगों का उपयोग केवल 2-बिंदुओं और 3-बिंदुओं के बीच अंतर करने के लिए किया जाता है (फर्क या लॉग के साथ उपयोग किए जाने की परवाह किए बिना)। आरेख सही है। पहले कॉलम में, 2-डॉट्स के साथ अंतर का परिणाम 3-डॉट्स के साथ लॉग के समान है (इसलिए पूरे उद्देश्य आरेख के साथ शुरू करने के लिए)। 2-डॉट्स के साथ अंतर दोनों डायवर्जेंस पॉइंट के लिए कोड परिवर्तन (कमिट्स और वैन आरेख के हरे भागों के द्वारा सचित्र) में परिवर्तन करता है, जबकि 3-डॉट्स के साथ लॉग परिवर्तन लॉग (प्रतिबद्ध संदेश) देता है दोनों में विचलन बिंदु तक नीचे जाता है।
डॉल्फिनड्रीम 14

28

git diff foo master फ़ू और मास्टर के शीर्ष (सिर) के बीच का अंतर।

git diff foo..master उसी काम को करने का एक और तरीका।

git diff foo...mastergit merge-base foo masterफू के सामान्य पूर्वज ( ) और मास्टर की नोक से मुश्किल। दूसरे शब्दों में, केवल उन परिवर्तनों को दिखाता है जो मास्टर ब्रांच ने अपने सामान्य पूर्वज के बाद से शुरू किए हैं।

GitHub का यह उदाहरण बताता है कि दो का उपयोग कब करना है:

उदाहरण के लिए, यदि आप 'देव' शाखा बनाते हैं और फ़ाइल में कोई फ़ंक्शन जोड़ते हैं, तो अपनी 'मास्टर' शाखा में वापस जाएँ और README से एक पंक्ति निकालें, और फिर कुछ इस तरह से चलाएँ:

$ git diff master dev

यह आपको बताएगा कि पहली फ़ाइल से एक फ़ंक्शन जोड़ा गया था और README में एक लाइन जोड़ी गई थी। क्यों? क्योंकि शाखा पर, README में अभी भी मूल पंक्ति है, लेकिन 'मास्टर' पर आपने इसे हटा दिया है - इसलिए सीधे स्नैपशॉट की तुलना करने से ऐसा लगता है कि 'dev' ने इसे जोड़ा है।

क्या आप वास्तव में तुलना करना चाहते हैं कि आपकी शाखाओं के विचलन के बाद क्या 'देव' बदल गया है। ऐसा करने के लिए, Git के पास एक छोटा सा शॉर्टहैंड है:

$ git diff master...dev

2
git diff foo ... मास्टर
चेंज

@manojisions ठीक है, इसलिए अलग सवाल है, अगर आप देव शाखा में हैं और अपने परिवर्तन (कार्य) करते हैं और एक दूरस्थ देव शाखा में परिवर्तन को धक्का देते हैं तो क्या इसका मतलब यह है कि दृश्यमान परिवर्तन केवल फ़ंक्शन या फ़ंक्शन और रीडमी है?
डेविड

अगर मैं गलत नहीं हूं, तो GitHub का पुल अनुरोध ट्रिपल ट्रिपल का उपयोग करता है। क्या वह सही है?
शॉन लुटिन

GitHub उदाहरण पृष्ठ का टूटा लिंक।
के-माइकल ऐ

6
git diff foo master

उस समय में विषय और मास्टर शाखा के बीच अंतर दिखाएगा

git diff foo..master

यह उस समय में विषय और मास्टर शाखा के बीच के अंतर को भी दिखाएगा

git diff foo...master

जब शाखा से और बाद में विषय बनाया गया था तब यह सभी अंतर दिखाएगा

इसलिए पहले 2 कमांड समान हैं और अंतिम एक ही है जो विस्तृत इतिहास में एक व्यापक दृश्य दिखाता है


1

गिट लॉग पेड़

ऊपर की तस्वीर नीचे के ग्राफ के पेड़ के बराबर है

A0 <- A1 <- A2 <- A3 (master)
   \
    C0 <- C1 (test)

एक तस्वीर एक हजार शब्दों के लायक है, इसके बीच अंतर .. ... ^नीचे दिखाया गया है।

$ git log master..test
# output C0 C1

$ git log ^master test
# output C0 C1

$ git log master…test
# output A1 A2 A3 C0 C1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.