मैं एक ही शाखा पर दो अलग-अलग कमिट्स के बीच एक ही फाइल को कैसे अलग कर सकता हूं?


1143

Git में, मैं एक ही ब्रांच (उदाहरण के लिए मास्टर) पर दो अलग-अलग कमिट (संक्रामक नहीं) के बीच एक ही फाइल की तुलना कैसे कर सकता हूं?

मैं विजुअल सोर्ससेफ़ (वीएसएस) या टीम फाउंडेशन सर्वर (टीएफएस) की तरह एक तुलना सुविधा के लिए खोज रहा हूं । क्या यह Git में संभव है?

जवाबों:


1475

से git-diffमैनपेज:

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

उदाहरण के लिए, अभी और दो के बीच "main.c" फ़ाइल के अंतर को देखने के लिए, यहाँ तीन समतुल्य कमांड हैं:

$ git diff HEAD^^ HEAD main.c
$ git diff HEAD^^..HEAD -- main.c
$ git diff HEAD~2 HEAD -- main.c

43
यह ..वास्तव में आवश्यक नहीं है, हालांकि यह इसके साथ काम करेगा (काफी पुराने संस्करणों को छोड़कर, शायद)। आप का उपयोग करने के लिए git logया gitkSHA1s खोजने के लिए भी उपयोग कर सकते हैं, क्या दो कमेंट्स बहुत दूर होने चाहिए। gitkइसके संदर्भ मेनू में "भिन्न चयनित -> यह" और "इसे अलग करें -> चयनित" भी है।
Cascabel

17
क्या यह काम तब भी होगा जब फ़ाइल का नाम 2 कमिट के बीच संशोधित किया गया था?
पुनर्नवाजोन

26
तो "-" का उद्देश्य क्या है
user64141

29
@ user64141 --उपयोगी है उदाहरण के लिए जब आपके पास एक फ़ाइल है जिसका नाम है -p। लिपियों में उपयोग करने के लिए अच्छा है, केवल अभ्यास में आवश्यक दुर्लभ मामलों में।
पेलेक

13
नोट: आपको रेपो की जड़ के सापेक्ष पथ का उपयोग करने की आवश्यकता है। वर्तमान कार्य निर्देशिका के सापेक्ष पथ काम नहीं करेगा।
केविन व्हीलर

280

आप दो अलग-अलग फ़ाइलों की तुलना दो अलग-अलग संशोधनों में कर सकते हैं, जैसे:

git diff <revision_1>:<file_1> <revision_2>:<file_2>


25
ध्यान दें कि ऐसा लगता है जैसे कि <file_1>और <file_2>वर्तमान निर्देशिका में हैं, शीर्ष स्तर पर प्रबंधित निर्देशिका में नहीं हैं, किसी को ./यूनिक्स पर प्रीपेंड करना होगा:<revision_1>:./filename_1
आंद्रे होल्जनर

7
<संशोधन>: ommitted किया जा सकता है, इसलिए आप एक फ़ाइल के साथ भिन्न हो सकते हैं जो अभी तक प्रतिबद्ध नहीं था।
यारोस्लाव निकितेंको

2
ध्यान दें कि विंडोज पर फ़ाइल पथों के लिए '/' का उपयोग करना है, न कि ''।
np8

87

यदि आपने "difftool" कॉन्फ़िगर किया है तो आप उपयोग कर सकते हैं

git difftool revision_1:file_1 revision_2:file_2

उदाहरण: किसी फाइल को उसकी पिछली कमेटी से उसी ब्रांच पर उसकी पिछली कमिट से तुलना करना: मान लेना कि अगर आप अपने प्रोजेक्ट में हैं तो रूट करें

$git difftool HEAD:src/main/java/com.xyz.test/MyApp.java HEAD^:src/main/java/com.xyz.test/MyApp.java

आपकी ~ / .itconfig या प्रोजेक्ट / .ITIT / कॉन्फ़िग फ़ाइल में निम्न प्रविष्टियाँ होनी चाहिए। P4merge स्थापित करें [यह मेरा पसंदीदा अंतर है और उपकरण मर्ज करें]

[merge]
    tool = p4merge
    keepBackup = false
[diff]
    tool = p4merge
    keepBackup = false
[difftool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
[mergetool]
    keepBackup = false
[difftool]
    keepBackup = false
[mergetool "p4merge"]
    path = C:/Program Files (x86)/Perforce/p4merge.exe
    cmd = p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"

50

जाँच करें $ git log, दो अलग-अलग कमिटों के SHA-1 ID की प्रतिलिपि बनाएँ , और git diffउन ID के साथ कमांड चलाएँ। उदाहरण के लिए:

$ git diff (sha-id-one) (sha-id-two)

18
यदि आप किसी विशिष्ट फ़ाइल के लिए अंतर चाहते हैं, तो कमांड के अंत में इसे पथ जोड़ें।
22

पूरे वृक्ष की जानकारी डाउनलोड करने के लिए एक "गिट पुल" भी करें यदि दो कमिट अलग-अलग शाखाओं में हैं। अन्यथा आपको "घातक: खराब वस्तु" त्रुटि मिलेगी।
user238607

4
git diff (sha-id-one) (sha-id-two) -- filename.ext फ़ाइल नाम के बिना यह उन दो कमिटों में सभी फाइलों की सूची अलग कर देगा ।
शेरलहोमन

40

यदि आप कमिट-बाय-कमिट के आधार पर दोनों के बीच फाइल में सभी बदलाव देखना चाहते हैं, तो आप भी कर सकते हैं

git log -u $start_commit..$end_commit -- path/to/file


"$ Start_commit" और "$ end_commit" क्या है? क्या वे शाब्दिक हैं, या यदि नहीं, तो क्या आप एक उदाहरण दे सकते हैं?
पीटर मोर्टेंसन

वे शेल चर हैं जिनमें प्रारंभ और अंत संशोधन होते हैं, जो इसके बजाय sha1 शाब्दिक या refs हो सकते हैं
cxreg

21

यहाँ एक पर्ल स्क्रिप्ट है जो Git को प्रिंट करता है एक दिए गए फ़ाइल के लिए Git लॉग कमांड में पाया गया है।

उदाहरण के लिए

git log pom.xml | perl gldiff.pl 3 pom.xml

पैदावार:

git diff 5cc287:pom.xml e8e420:pom.xml
git diff 3aa914:pom.xml 7476e1:pom.xml
git diff 422bfd:pom.xml f92ad8:pom.xml

जो तब कटा हुआ हो सकता है और शेल विंडो सत्र में चिपकाया जा सकता है या पाइप किया जा सकता है /bin/sh

टिप्पणियाँ:

  1. संख्या (इस मामले में 3) निर्दिष्ट करती है कि कितनी लाइनें प्रिंट करनी हैं
  2. फ़ाइल (इस मामले में pom.xml) को दोनों स्थानों में सहमत होना चाहिए (आप इसे शेल फ़ंक्शन में दोनों स्थानों पर समान फ़ाइल प्रदान करने के लिए लपेट सकते हैं) या इसे बाइनरी निर्देशिका में शेल स्क्रिप्ट के रूप में रख सकते हैं

कोड:

# gldiff.pl
use strict;

my $max  = shift;
my $file = shift;

die "not a number" unless $max =~ m/\d+/;
die "not a file"   unless -f $file;

my $count;
my @lines;

while (<>) {
    chomp;
    next unless s/^commit\s+(.*)//;
    my $commit = $1;
    push @lines, sprintf "%s:%s", substr($commit,0,6),$file;
    if (@lines == 2) {
        printf "git diff %s %s\n", @lines;
        @lines = ();
    }
    last if ++$count >= $max *2;
}

14

यदि आप @mipadi द्वारा निर्दिष्ट विधि के साथ, एक से अधिक फ़ाइल के साथ एक अंतर बनाना चाहते हैं:

जैसे सभी फ़ाइलों को खोजने के लिए HEADऔर आपके बीच में अंतर :master.coffee

git diff master..HEAD -- `find your_search_folder/ -name '*.coffee'`

यह आपके your_search_folder/सभी .coffeeफ़ाइलों के लिए पुन: खोज करेगा और उनके और उनके masterसंस्करणों के बीच एक अंतर बना देगा ।


13

यदि आपके पास कई फाइलें या निर्देशिकाएं हैं और आप निरंतर निरंतर तुलना करना चाहते हैं, तो आप ऐसा कर सकते हैं:

एक अस्थायी शाखा बनाएं ( इस उदाहरण में "संशोधन" )

git checkout -b revision

पहले प्रतिबद्ध लक्ष्य को पुरस्कृत करें

git reset --hard <commit_target>

रुचि रखने वालों पर चेरी चुनती है

git cherry-pick <commit_interested> ...

लागू लागू करें

git diff <commit-target>^

जब आपने किया

git branch -D revision

2
इस समाधान के लिए धन्यवाद। इसने मेरे उपयोग के मामले में अच्छा काम किया। केवल एक चीज जो मैं अपडेट करूंगा वह यह है कि जब आपका काम पूरा हो जाए तब तक आप शाखा को हटा नहीं सकते।
स्टीवन डिक्स

9

Git की अजीबता का उपयोग करने का सिर्फ एक और तरीका ...

git difftool HEAD HEAD@{N} /PATH/FILE.ext

मैंने इस उत्तर से एक उपनाम को परिभाषित किया है जो बैश के साथ काम करता है:difftool-file = "!git difftool HEAD@{\"$2\"} HEAD \"$1\" #"
14:00 बजे ब्लूजिव

2

यदि आप Windows पर एक साधारण दृश्य तुलना चाहते हैं जैसे आप Visual SourceSafe या Team Foundation सर्वर (TFS) में प्राप्त कर सकते हैं , तो यह कोशिश करें:

  • फ़ाइल एक्सप्लोरर में फ़ाइल पर राइट-क्लिक करें
  • 'गेट हिस्ट्री' चुनें

नोट: विंडोज 10 में अपग्रेड करने के बाद मैंने गिट संदर्भ मेनू विकल्प खो दिया है। हालाँकि, आप कमांड विंडो में 'gitk' या 'gitk filename' का उपयोग करके समान चीज़ प्राप्त कर सकते हैं।

एक बार जब आप 'Git History' कहते हैं, Git GUI टूल शुरू हो जाएगा, जिसमें ऊपरी बाएँ फलक में फ़ाइल का इतिहास होगा। उन संस्करणों में से एक का चयन करें जिनकी आप तुलना करना चाहते हैं। फिर दूसरे संस्करण पर राइट-क्लिक करें और या तो चुनें

यह मुश्किल -> चयनित

या

मुश्किल चयनित -> यह

रंग-कोडित अंतर निचले बाएँ-फलक में दिखाई देगा।


डाउनवोटर्स पर ध्यान दें: यह एक सरल समाधान है, ओपी के मुद्दे को लागू करने और संबोधित करने में आसान है। यह विंडोज पर काम करता है जिसे ओपी स्पष्ट रूप से उपयोग कर रहा है (टीएफएस और वीएसएस के संदर्भ देखें)।
संसाधन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.