कमिट के बीच अंतर दिखाएं


236

मैं Ubuntu 10.04 (ल्यूसिड लिंक्स) पर Git का उपयोग कर रहा हूं ।

मैंने अपने स्वामी के लिए कुछ काम किए हैं।

हालांकि, मैं इन कमिट्स के बीच अंतर प्राप्त करना चाहता हूं। वे सब मेरी गुरु शाखा पर हैं।

उदाहरण के लिए:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

मैं k73ud और dj374 के बीच अंतर प्राप्त करना चाहता हूं। हालाँकि, जब मैंने निम्नलिखित किया तो मैं अपने द्वारा किए गए परिवर्तनों को नहीं देख सका k73ud

git diff k73ud..dj374 > master.patch

जवाबों:


275

प्रयत्न

git diff k73ud^..dj374

k73udपरिणामी अंतर में सभी परिवर्तनों को शामिल करना सुनिश्चित करें ।

git diffदो एंडपॉइंट्स की तुलना करता है ( एक प्रतिबद्ध सीमा के बजाय )। चूंकि ओपी द्वारा शुरू किए गए परिवर्तनों को देखना चाहते हैं k73ud, इसलिए उसे पहले माता-पिता की प्रतिबद्धता केk73udk73ud^ बीच अंतर करने की आवश्यकता है : (या k73ud^1याk73ud~ )।

इस तरह, diffपरिणामों में माता-पिता के बाद से परिवर्तन शामिल होंगे k73ud(मतलब k73udस्वयं से परिवर्तन सहित ), (ऊपर ) के बाद से शुरू किए गए परिवर्तनों के बजाय ।k73uddj374

इसके अलावा आप कोशिश कर सकते हैं:

git diff oldCommit..newCommit
git diff k73ud..dj374 

और (1 स्थान, अधिक नहीं):

git diff oldCommit newCommit
git diff k73ud dj374

और अगर आपको केवल फाइल नाम प्राप्त करने की आवश्यकता है (उदाहरण के लिए उन्हें मैन्युअल रूप से कॉपी करने के लिए):

git diff k73ud dj374 --name-only

और आप किसी अन्य शाखा में लागू परिवर्तन प्राप्त कर सकते हैं:

git diff k73ud dj374 > my.patch
git apply my.patch

5
क्या आपको यकीन है? Git 275e8922ab4e995f47a753b88b75c3027444a54c..a8d9d944c32e945cbb9f60b3f724ecc580da86ae काम करता है diff, लेकिन Git diff 275e8922ab4e995f47a753b88b75c3027444a54c ^ .. a8d9d944c32e945cbb9f60b3f724ecc580da86ae प्राप्त त्रुटि संदेश - "अज्ञात संशोधन या पथ काम कर पेड़ में नहीं"
Demas

@demas: मेरी मशीन पर काम करता है;) आप भी उपयोग कर सकते हैं git diff 275e8^ a8d9d9क्योंकि यह वही है तो ' ..'।
वॉनसी

4
@VonC मेरी मशीन में,
xi.lin

5
@VonC Ubuntu 14.04। केवल git diff k73ud..dj374ओके है
xi.lin

1
@ ब्रैडीडॉवलिंग सहमत। और यदि आप एक पीआर अंतर देखना चाहते हैं, तो आप नई ghCLI के साथ कमांड लाइन में ऐसा कर सकते हैं : stackoverflow.com/a/62031065/6309
VonC

126

के बीच अंतर देखने के लिए:

आपकी कार्य प्रतिलिपि और मंचन क्षेत्र:

% git diff

मंचन क्षेत्र और नवीनतम प्रतिबद्धता:

% git diff --staged

आपकी कार्य प्रतिलिपि और 4ac0a6733:

% git diff 4ac0a6733

प्रतिबद्ध 4ac0a6733 और नवीनतम प्रतिबद्ध:

% git diff 4ac0a6733 HEAD

4ac0a6733 से और 826793951 से कमिट करें

% git diff 4ac0a6733 826793951

अधिक विवरण के लिए आधिकारिक दस्तावेज देखें ।


7
इसके अलावा, यदि आप वास्तव में उन कमिट्स में केवल एक फ़ाइल के डिफरेन्स को देखना चाहते हैं, तो वे दिए गए उदाहरणों में से कोई भी git diff {x} {y} -- filenameकहां {x}और क्या {y}हैं। यह भी देखें git log -p, क्योंकि कुछ ओवरलैप हैं।
माइकल

54

यदि आप प्रत्येक प्रतिबद्ध के साथ शुरू किए गए परिवर्तनों को देखना चाहते हैं, तो "git log -p" आज़माएँ


13
  1. gitk --all
  2. पहले कमिट का चयन करें
  3. दूसरे पर राइट क्लिक करें , फिर चुने हुए → इसको अलग करें

मैं gitk पर थोड़ा कम भरोसा करना शुरू कर रहा हूं क्योंकि यह वास्तविक की तुलना में एक अलग कॉमिटर लेखक दिखा रहा है।
Ciasto piekarz

10

मैं gitkअंतर देखने के लिए उपयोग करता हूं :

gitk k73ud..dj374

इसमें GUI मोड है ताकि समीक्षा करना आसान है।


7

दो अलग-अलग कमिट्स के बीच अंतर देखने के लिए (चलो उन्हें कॉल करें aऔर b), का उपयोग करें

git diff a..b
  • ध्यान दें कि बीच का अंतर aऔर bसे विपरीत है bऔर a

अपने अंतिम प्रतिबद्ध और अभी तक किए गए परिवर्तनों के बीच अंतर देखने के लिए, उपयोग करें

git diff

यदि आप बाद में अंतर पर वापस आने में सक्षम होना चाहते हैं, तो आप इसे एक फ़ाइल में सहेज सकते हैं।

git diff a..b > ../project.diff

5

खींचने के बाद अंतिम 2 में बदलावों की जाँच के लिए सबसे सरल:

git diff HEAD~2 

3

मैंने एक स्क्रिप्ट लिखी, जो दो कमिट के बीच प्रदर्शित होती है, उबंटू पर अच्छी तरह से काम करती है।

https://gist.github.com/jacobabrahamb4/a60624d6274ece7a0bd2d141b53407bc

#!/usr/bin/env python
import sys, subprocess, os

TOOLS = ['bcompare', 'meld']

def execute(command):
    return subprocess.check_output(command)

def getTool():
    for tool in TOOLS:
        try:
            out = execute(['which', tool]).strip()
            if tool in out:
                return tool
        except subprocess.CalledProcessError:
            pass
    return None

def printUsageAndExit():
    print 'Usage: python bdiff.py <project> <commit_one> <commit_two>'
    print 'Example: python bdiff.py <project> 0 1'
    print 'Example: python bdiff.py <project> fhejk7fe d78ewg9we'
    print 'Example: python bdiff.py <project> 0 d78ewg9we'
    sys.exit(0)

def getCommitIds(name, first, second):
    commit1 = None
    commit2 = None
    try:
        first_index = int(first) - 1
        second_index = int(second) - 1
        if int(first) < 0 or int(second) < 0:
            print "Cannot handle negative values: "
            sys.exit(0)
        logs = execute(['git', '-C', name, 'log', '--oneline', '--reverse']).splitlines()
        if first_index >= 0:
            commit1 = logs[first_index].split(' ')[0]
        if second_index >= 0:
            commit2 = logs[second_index].split(' ')[0]
    except ValueError:
        if first is not '0':
            commit1 = first
        if second is not '0':
            commit2 = second
    return commit1, commit2

def validateCommitIds(name, commit1, commit2):
    if not commit1 and not commit2:
        print "Nothing to do, exit!"
        return False
    try:
        if commit1:
            execute(['git', '-C', name, 'cat-file', '-t', commit1])
        if commit2:
            execute(['git', '-C', name, 'cat-file', '-t', commit2])
    except subprocess.CalledProcessError:
        return False
    return True

def cleanup(commit1, commit2):
        execute(['rm', '-rf', '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')])

def checkoutCommit(name, commit):
    if commit:
        execute(['git', 'clone', name, '/tmp/'+commit])
        execute(['git', '-C', '/tmp/'+commit, 'checkout', commit])
    else:
        execute(['mkdir', '/tmp/0'])

def compare(tool, commit1, commit2):
        execute([tool, '/tmp/'+(commit1 if commit1 else '0'), '/tmp/'+(commit2 if commit2 else '0')])

if __name__=='__main__':
    tool = getTool()
    if not tool:
        print "No GUI diff tools, install bcompare or meld"
        sys.exit(0)
    if len(sys.argv) is not 4:
        printUsageAndExit()

    name, first, second = None, 0, 0
    try:
        name, first, second = sys.argv[1], sys.argv[2], sys.argv[3]
    except IndexError:
        printUsageAndExit()

    commit1, commit2 = getCommitIds(name, first, second)

    if validateCommitIds(name, commit1, commit2) is False:
        sys.exit(0)

    cleanup(commit1, commit2)

    try:
        checkoutCommit(name, commit1)
        checkoutCommit(name, commit2)
        compare(tool, commit1, commit2)
    except KeyboardInterrupt:
        pass
    finally:
        cleanup(commit1, commit2)
    sys.exit(0)

1
दिलचस्प स्क्रिप्ट। +1
वॉन

2

स्वीकृत उत्तर अच्छा है।

बस इसे फिर से यहाँ डाल रहे हैं, ताकि भविष्य में समझने और कोशिश करने में आसान हो

git diff c1...c2 > mypatch_1.patch  
git diff c1..c2  > mypatch_2.patch  
git diff c1^..c2 > mypatch_3.patch  

उपरोक्त सभी आदेशों के लिए मुझे समान अंतर मिला।

उपरोक्त में मदद करता है
1. कमिट सी 1 और दूसरी कमिट सी
2 के बीच अंतर देखना 2. एक पैच फाइल भी बनाना जो अलग दिखाता है और इसका उपयोग दूसरी शाखा में परिवर्तन लागू करने के लिए किया जा सकता है।

यदि यह ठीक से अंतर नहीं दिखा रहा है,
तो c1 और c2 को गलत लिया जा सकता है,
इसलिए उन्हें c1 से c0 की तरह पहले से समायोजित करें, या c2 से c3 की तरह एक के बाद एक करें

gitkशट्स को देखने के लिए उपयोग करें , 1st 8 अक्षर c0, c1, c2 या c3 के रूप में उनका उपयोग करने के लिए पर्याप्त हैं। आप Gitlab> रिपॉजिटरी> कमिट्स, आदि से कमिट आईडी भी देख सकते हैं।

उम्मीद है की वो मदद करदे।


0

मान लें कि आपके पास नीचे (सबसे पुराना) एक और कमिटमेंट है, तो यह बहुत आसान हो जाता है:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

अब, नीचे दिए गए उपयोग से आसानी से उद्देश्य पूरा हो जाएगा।

git diff k73ud oldestCommit

-2

प्रतिबद्ध और अस्थिर के बीच अंतर के लिए इस आदेश का उपयोग करें:

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