दो अलग-अलग शाखाओं की फ़ाइलों की तुलना कैसे करें?


1537

मेरे पास एक स्क्रिप्ट है जो एक शाखा में ठीक काम करती है और दूसरी में टूट जाती है। मैं दो संस्करणों को एक साथ देखना चाहता हूं और देखना चाहता हूं कि क्या अलग है। क्या ऐसा करने के कोई तरीके हैं?

स्पष्ट होने के लिए मैं एक तुलना उपकरण की तलाश नहीं कर रहा हूं (मैं परे का उपयोग करता हूं)। मैं एक git diff कमांड की तलाश कर रहा हूं जो मुझे मास्टर वर्जन की तुलना मेरे वर्तमान ब्रांच वर्जन से करने की अनुमति देगा कि क्या बदला है। मैं किसी मर्ज या किसी चीज़ के बीच में नहीं हूं। मैं सिर्फ कुछ कहना चाहता हूं

git diff mybranch/myfile.cs master/myfile.cs

जवाबों:


2207

git diff आपको दो कमिट के बीच का अंतर दिखा सकता है:

git diff mybranch master -- myfile.cs

या, समकक्ष:

git diff mybranch..master -- myfile.cs

, बाद सिंटैक्स का उपयोग करता है, तो दोनों ओर है HEADयह हटाया जा सकता है (उदाहरण के लिए master..तुलना masterकरने के लिए HEAD)।

आपकी रुचि mybranch...master( git diffडॉक्स से ) भी हो सकती है :

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

दूसरे शब्दों में, यह masterतब से कई बदलाव देगा, क्योंकि यह mybranch(लेकिन तब से नए बदलाव के बिना mybranch) में बदल गया है ।


सभी मामलों में, --फ़ाइल नाम से पहले विभाजक कमांड लाइन के झंडे के अंत का संकेत देता है। यह वैकल्पिक है जब तक कि तर्क या किसी फ़ाइल को संदर्भित करने पर गिट भ्रमित हो जाएगा, लेकिन इसमें शामिल होने के लिए एक बुरी आदत नहीं है। कुछ उदाहरणों के लिए https://stackoverflow.com/a/13321491/54249 देखें ।


git difftoolयदि आपके पास एक कॉन्फ़िगर किया गया है तो वही तर्क पारित किए जा सकते हैं ।


44
और यदि आप दोनों में से कोई भी संस्करण की तुलना नहीं करना चाहते हैं, तो आप कार्य का उपयोग कर सकते हैं git diff branch1 branch2 myfile.cs। ( --अब और आवश्यक नहीं होना चाहिए, क्योंकि यह केवल दो संशोधन तर्क तक ले जा सकता है।)
कैस्केबेल

8
मैंने इसके हर संस्करण की कोशिश की है और कुछ भी नहीं होता है। मेरे पास मेरा difftool कॉन्फ़िगर है (यह विलय के लिए काम करता है)। मेरे पास bd.ps1 नामक एक फाइल है। मेरे द्वारा लिखे गए कमांड का हर संस्करण कुछ नहीं करता है। एक भी नहीं देता है। WTH!?!?!
मीका

3
@ मिचा: क्या आप इसे सादे अंतर के साथ भी आज़मा रहे हैं? क्या आप वर्तमान निर्देशिका के सापेक्ष सही तरीके से टाइप कर रहे हैं? (यह चुपचाप कोई अंतर नहीं दिखाएगा यदि फ़ाइल मौजूद नहीं है, और आप --सामान्य और आसान गलती का उपयोग करते हैं।)
Cascabel

5
यह मेरे लिए तब तक काम नहीं आया जब तक कि मैंने फ़ाइल में पूर्ण पथ शामिल नहीं किया, जैसा कि git diff --name-status branch1..branch2(शायद स्पष्ट रूप से दिखाया गया था, लेकिन मुझे लगा कि मैं इसका उल्लेख किसी और मुसीबत में करता हूं)।
hBrent 21

4
माइब्रंच और मास्टर का क्रम भी महत्वपूर्ण है। पहली शाखा में फ़ाइल को '-' उपसर्गों के साथ दिखाया जाएगा, दूसरी शाखा में फ़ाइल को '+' उपसर्गों के साथ दिखाया जाएगा।
टिम्पी

413

तुम यह केर सकते हो: git diff branch1:path/to/file branch2:path/to/file

यदि आपके पास difftool कॉन्फ़िगर किया गया है, तो आप यह भी कर सकते हैं: git difftool branch1:path/to/file branch2:path/to/file

संबंधित प्रश्न: मैं दृश्य भिन्न कार्यक्रम के साथ git diff आउटपुट कैसे देख सकता हूं


4
कॉलनों का उपयोग करना वास्तव में एक शानदार तरीका नहीं है - इसका मतलब है कि आप पेड़ों की वस्तुओं के माध्यम से फाइलों को संदर्भित कर रहे हैं, इसलिए आपको अपनी वर्तमान निर्देशिका के सापेक्ष पूर्ण पथ टाइप करना होगा।
कास्केबेल

13
@ जेफ्रोमी, यह एक और हालिया संस्करण में बदल गया है, लेकिन कम से कम अब आप रिश्तेदार पथ (जैसे branch1:./file) का उपयोग कर सकते हैं । यह भी उपयोगी है अगर फ़ाइल शाखाओं (जैसे git diff branch1:old/path/to/file branch2:new/path/to/file) के बीच एक अलग स्थान पर है ।
redbmk

4
@redbmk हाँ, यह 2010 और अब के बीच का समय था! फिर भी, अगर यह दोनों शाखाओं पर एक ही फ़ाइल है, तो इसे इस तरह से करने की कोई आवश्यकता नहीं है, बस git diff branch1 branch2 path/to/file
कैस्केबेल

3
@ जेफ्रोमी शांत, मुझे यकीन नहीं था कि उस समय को जोड़ा गया था। हाँ, मैं आमतौर पर आपके द्वारा बताए गए वाक्यविन्यास का उपयोग करूंगा, लेकिन टिम के जवाब ने मुझे यह पता लगाने में मदद की कि विभिन्न रास्तों की फाइलों की तुलना कैसे की जाए, हालांकि यह वास्तव में वह सवाल नहीं है जो पूछ रहा है
Redbmk

1
जब मैं इस विचार से प्यार करता हूं, तो मैं इस वाक्यविन्यास को काम करने के लिए नहीं पा सकता हूं या इसके बारे में कोई उल्लेख नहीं कर सकता। मैं क्या खो रहा हूँ? धन्यवाद!
योयो

160

अधिक आधुनिक वाक्य रचना:

git diff ..master path/to/file

डबल-डॉट उपसर्ग का अर्थ है "वर्तमान कामकाजी निर्देशिका से"। तुम भी कह सकते हो:

  • master.., यानी ऊपर का उलटा। यह भी ऐसा ही है master
  • mybranch..master, स्पष्ट रूप से वर्तमान कार्यशील पेड़ के अलावा एक राज्य को संदर्भित करना।
  • v2.0.1..master, यानी एक टैग को संदर्भित करना।
  • [refspec]..[refspec], मूल रूप से कुछ भी पहचान करने के लिए एक कोड राज्य के रूप में पहचान।

33

दो अलग-अलग शाखाओं की फ़ाइलों की तुलना करने के कई तरीके हैं:

  • विकल्प 1: यदि आप फ़ाइल की n विशिष्ट शाखा से दूसरी विशिष्ट शाखा से तुलना करना चाहते हैं:

    git diff branch1name branch2name path/to/file
    

    उदाहरण:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    इस उदाहरण में आप "mybranch" शाखा में फ़ाइल की तुलना "mysecondbranch" शाखा में फ़ाइल से कर रहे हैं।

  • विकल्प 2: सरल तरीका:

     git diff branch1:file branch2:file
    

    उदाहरण:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    यह उदाहरण विकल्प 1 के समान है।

  • विकल्प 3: यदि आप अपनी वर्तमान कार्यशील निर्देशिका की तुलना किसी शाखा से करना चाहते हैं:

    git diff ..someBranch path/to/file
    

    उदाहरण:

    git diff ..master myfile.cs
    

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


12

मैं बस करता हूं git diff branch1 branch2 path/to/file

यह फाइलों के बीच अंतर की जांच करता है। में परिवर्तन branch1लाल रंग में होगा। में परिवर्तन branch2हरे रंग में होगा।

यह माना जाता है कि branch1अतीत है और branch2भविष्य है। आप इसे अलग-अलग शाखाओं के क्रम को उल्टा करके उल्टा कर सकते हैं:git diff branch2 branch1


Git diff का कौन सा संस्करण ऐसा कर सकता है? यह मेरे द्वारा चलाए जा रहे संस्करण में समर्थित नहीं लगता है (2..9.2.windows.1)।
विंस बॉड्रेन

9

यदि आप करंट ब्रांच के खिलाफ कोई फर्क करना चाहते हैं तो आप इसका इस्तेमाल कर सकते हैं:

git diff $BRANCH -- path/to/file

इस तरह यह वर्तमान शाखा से संदर्भित शाखा ( $BRANCH) में अलग हो जाएगा।


5

@Dahlbyk द्वारा सुझाए गए उत्तर से सहमत। यदि आप चाहते हैं कि कोड समीक्षा के लिए एक अलग फ़ाइल में लिखा जाए, तो निम्नलिखित कमांड का उपयोग करें।

git diff branch master -- filepath/filename.extension > filename.diff --cached

2

मेरे मामले में, मैं नीचे दिए गए आदेश का उपयोग करता हूं:

git diff <branch name> -- <path + file name>

यह कमांड आपको दो अलग-अलग शाखाओं में एक ही फाइल की तुलना करने में मदद कर सकती है


1

git diffनिम्न तरीके से इसका उपयोग करने का सबसे अच्छा तरीका है : git diff <source_branch> <target_branch> -- file_path

यह उन शाखाओं में फ़ाइलों के बीच अंतर की जांच करेगा। Git कमांड और वे कैसे काम करते हैं , इस बारे में अधिक जानकारी के लिए इस लेख को देखें ।


1

इस तरह से हैश का उपयोग करें:

git diff <hash1> <hash2> <filename>

जहां hash1 किसी भी हो सकता है किसी भी शाखा, के लिए एक ही से प्रतिबद्ध hash2


1

फ़ाइलों की तुलना करने के लिए दो परिदृश्य हैं:

परिदृश्य 1: दूरस्थ शाखाओं की फाइलों की तुलना करें (दोनों शाखाएं दूरस्थ भंडार पर मौजूद होनी चाहिए)

परिदृश्य 2: दूरस्थ रिपॉजिटरी में फ़ाइलों की तुलना स्थानीय फ़ाइलों (स्थानीय कार्य क्षेत्र की प्रतिलिपि पर) से करें।

तर्क सरल है। यदि आप अंतर करने के लिए दो शाखा नाम प्रदान करते हैं, तो यह हमेशा दूरस्थ शाखाओं की तुलना करेगा, और यदि आप केवल एक शाखा नाम प्रदान करते हैं, तो यह हमेशा दूरस्थ रेपो (आपके द्वारा प्रदान की गई) के साथ आपकी स्थानीय कार्य प्रतिलिपि की तुलना करेगा। आप दूरस्थ रिपॉजिटरी प्रदान करने के लिए रेंज का उपयोग कर सकते हैं।

उदा। एक शाखा की जाँच करें

git checkout branch1
git diff branch2 [filename]

इस मामले में, यदि आप फ़ाइल नाम प्रदान करते हैं, तो यह " शाखा 2 " नामक दूरस्थ शाखा के साथ फ़ाइल नाम की आपकी स्थानीय प्रतिलिपि की तुलना करेगा ।

git diff branch1 branch2 [filename]

इस मामले में, यह "नाम दूरस्थ शाखाओं से फ़ाइल नाम की तुलना करेंगे Branch1 बनाम" " Branch2 "

git diff ..branch2 [filename]

इस मामले में भी, यह "नाम दूरस्थ शाखाओं से फ़ाइल नाम की तुलना करेंगे Branch1 " बनाम " Branch2 "। तो, इसके ऊपर के रूप में ही है। हालाँकि, यदि आपने दूसरी शाखा से एक शाखा बनाई है, तो "मास्टर" कहें और आपकी वर्तमान शाखा दूरस्थ रिपॉजिटरी में मौजूद नहीं है, यह दूरस्थ " मास्टर " बनाम रिमोट " ब्रांच 2 " की तुलना करेगी ।

आशा है कि यह उपयोगी है।


0

Git bash में दो फाइलों की तुलना करने के लिए आपको कमांड का उपयोग करने की आवश्यकता है:

git diff <Branch name>..master -- Filename.extension   

यह कमांड बैश में ही दो फाइलों के बीच अंतर दिखाएगा।

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