Git वर्तमान शाखा और मास्टर के बीच भिन्न होता है लेकिन अनमैरिड मास्टर कमिट्स को शामिल नहीं करता है


171

मैं एक शाखा में सभी परिवर्तनों का एक हिस्सा चाहता हूं जो अभी तक मास्टर में विलय नहीं हुआ है।

मैंने कोशिश की:

git diff master
git diff branch..master
git diff branch...master

हालाँकि, इन मामलों में से प्रत्येक में मास्टर में ऐसी सामग्री शामिल है जिसे अभी तक मेरी शाखा में विलय नहीं किया गया है।

क्या मेरी शाखा और मास्टर के बीच एक अंतर करने का एक तरीका है जो मास्टर में उन परिवर्तनों को शामिल करता है जिन्हें अभी तक मेरी शाखा में विलय नहीं किया गया है?


9
यदि आप दूसरे संस्करण के चारों ओर घूमते हैं, तो आपको वही मिलता है जो आप चाहते हैं git diff master..branch:। git diff master..यदि आप शाखा पर हैं, तो आप इसे छोटा कर सकते हैं। r1..r2वाक्य रचना छोटे के लिए है ^r1 r2जिसका अर्थ है "मुझे सब कुछ पता चलता है कि से उतरता है r2और से पहुंच योग्य नहीं है r1"। git help gitrevisionsआपके द्वारा उपयोग किए जाने वाले विभिन्न सिंटैक्स पर जानकारी हो सकती है।
जॉन एसज़ाकमिस्टर

1
के ...सिंटैक्स पर अधिक पढ़ने के बाद मैंने अपने उत्तर का विस्तार किया git diff। आपकी टिप्पणी गलत है, @jszakmeister, क्योंकि संशोधन के रूप में वर्णित के gitrevisionsसाथ कुछ नहीं करना है git diff। डिफ इतिहास में दो बिंदुओं की तुलना करता है, एक सीमा के साथ काम नहीं कर सकता है।
पलक

तुम सही हो। मैं हमेशा यह भूल जाता हूं कि git diffअन्य आदेशों की तुलना में अलग तरह से काम करता है ... एक तथ्य जो मुझे निराशाजनक लगता है। :-(
जॉन स्जाकमेस्टर

यह सुनिश्चित करने के लिए कि आप तुलना करने से पहले मास्टर की स्थानीय प्रति अपडेट कर लें
जो

जवाबों:


232
git diff `git merge-base master branch`..branch

मर्ज बेस वह बिंदु है जहां branchसे हटा दिया गया है master

Git diff इसके लिए एक विशेष सिंटैक्स का समर्थन करता है:

git diff master...branch

आपको पक्षों को स्वैप नहीं करना चाहिए क्योंकि तब आपको दूसरी शाखा मिलेगी। आप जानना चाहते हैं कि इससे किस परिवर्तन के branchबाद से इसमें बदलाव आया हैmaster , यह दूसरे तरीके नहीं।

पूरी तरह से संबंधित:


ध्यान दें कि ..और ...वाक्यविन्यास में अन्य शब्द उपकरण के समान शब्दार्थ नहीं है। इसमें निर्दिष्ट अर्थ से भिन्न है man gitrevisions

उद्धरण man git-diff:

  • git diff [--options] <commit> <commit> [--] [<path>…]

    यह दो मध्यस्थों के बीच परिवर्तनों को देखना है <commit>

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

    यह पिछले फॉर्म का पर्याय है। यदि <commit>एक तरफ छोड़ दिया जाता है, तो इसका उपयोग HEADकरने की तरह ही प्रभाव होगा ।

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

    यह फ़ॉर्म <commit>दोनों के एक सामान्य पूर्वज से शुरू होने वाली शाखा पर होने वाले परिवर्तनों को देखने और दूसरी तक देखने के लिए है <commit>। " git diff A...B" के बराबर है " git diff $(git-merge-base A B) B"। आप किसी भी एक को छोड़ सकते हैं <commit>, जिसका उपयोग HEADकरने के बजाय एक ही प्रभाव है ।

बस अगर आप कुछ विदेशी कर रहे हैं, तो यह ध्यान दिया जाना चाहिए कि <commit>उपरोक्त सभी विवरण, अंतिम दो रूपों को छोड़कर जो ".." अंकन का उपयोग करते हैं, कोई भी हो सकता है <tree>

वर्तनी के तरीकों की अधिक पूरी सूची के लिए <commit>, "विशिष्ट संदर्भ निर्दिष्ट करें" अनुभाग देखें gitrevisions[7]। हालाँकि, "diff" दो एंडपॉइंट्स की तुलना करने के बारे में है, न कि पर्वतमाला, और रेंज नोटेशन (" <commit>..<commit>" और " <commit>...<commit>") का अर्थ यह नहीं है कि "स्पेसिफिक रेज़ेस" खंड में परिभाषित किया गया है gitrevisions[7]


मेरे लिए $ git diff master...branchनिर्मित fatal: ambiguous argument 'master...branch': unknown revision or path not in the working tree.- क्या यह संस्करण पर निर्भर कमांड है?
जोएल पेल्टनन

वास्तव में, मुझे बस एहसास हुआ कि "शाखा" आपकी शाखा का नाम होना चाहिए, मुझे लगा कि यह वर्तमान शाखा का एक संदर्भ है
जोएल पेल्टनन

4
आप सही हैं, मेरा उत्तर उस शाखा पर निर्भर करता है जिसे कहा जा रहा है branch। मैंने उस नाम के साथ चिपकना चुना, जिसे ओपी ने प्रश्न में चुना था। यदि आप वर्तमान शाखा का उपयोग करना चाहते हैं, तो branchसाथ बदलें HEAD
पालक

14
ध्यान दें कि आप git diff master...शाखा को निर्दिष्ट करने से बचने के लिए उपयोग कर सकते हैं (वर्तमान को लिया जाएगा)।
VasiliNovikov

1
क्या आपने devel@ChrisGuest की जाँच करने के बाद मूल कमांड काम किया है ? शायद, Git ने चेकआउट के दौरान आपके लिए एक दूरस्थ शाखा (आमतौर पर origin/devel) की स्थानीय प्रति के रूप में शाखा बनाई थी । अगर ऐसा git diff origin/devel...bugfix/API-353-api-allows-database-access-whenहोता , तो चेकआउट से पहले भी काम किया होता।
पालिक

44

यहाँ मेरे लिए क्या काम किया गया है:

git diff origin/master...

यह केवल मेरी वर्तमान में चयनित स्थानीय शाखा और दूरस्थ मास्टर शाखा के बीच के परिवर्तनों को दिखाता है, और मेरी स्थानीय शाखा में सभी परिवर्तनों को अनदेखा करता है जो मेरिट कमिट से आते हैं।


संदर्भ के लिए, यदि आपको उन परिवर्तनों के प्रतिबद्ध रेफरी की आवश्यकता है जिनमें ये परिवर्तन, उपयोग हैं git cherry origin/master
जयंती

यदि यह कूड़े का एक गुच्छा दिखाता है जिसकी आपको उम्मीद नहीं थी, masterतो हो सकता है कि आपके नीचे से कमिट्स का एक सेट रिबूट हो गया हो।
माइकल - व्हेयर क्ले शिर्की

21

जैसा कि जॉन ज़ैकेमिस्टर और वासिलीनोविकोव ने भी उल्लेख किया है, अपनी शाखा पर मास्टर के दृष्टिकोण से पूर्ण अंतर पाने के लिए सबसे छोटा आदेश है:

git diff master...

यह आपकी स्थानीय प्रति का उपयोग करता है।

एक विशिष्ट फ़ाइल उपयोग की तुलना करने के लिए:

git diff master... filepath

आउटपुट उदाहरण:

उदाहरण उपयोग

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