在提交之间显示差异

时间:2010-07-30 03:49:02

标签: git git-diff

我在Ubuntu 10.04(Lucid Lynx)上使用Git。

我已经向我的主人做了一些提交。

但是,我希望得到这些提交之间的区别。所有这些都在我的主分支上。

例如:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

我希望得到k73ud和dj374之间的区别。但是,当我执行以下操作时,我无法看到我在k73ud中所做的更改。

git diff k73ud..dj374 > master.patch

14 个答案:

答案 0 :(得分:173)

尝试

git diff k73ud^..dj374

确保在结果差异中包含k73ud的所有更改。

git diff比较两个端点(instead of a commit range)。 由于OP希望查看k73ud引入的更改,因此他/她需要区分first parent commit of k73ud: k73ud^(或k73ud^1 or k73ud~)。

这样,diff结果将包含 k73ud之后的更改(意味着包括k73ud本身的更改),而不是引入的更改自 k73ud(最多dj374)。

你也可以尝试:

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

答案 1 :(得分:103)

要查看以下内容之间的区别:

您的工作副本和临时区域:

% git diff

暂存区域和最新提交:

% git diff --staged

您的工作副本并提交4ac0a6733:

% git diff 4ac0a6733

提交4ac0a6733和最新提交:

% git diff 4ac0a6733 HEAD

提交4ac0a6733并提交826793951

% git diff 4ac0a6733 826793951

有关详细说明,请参阅the official documentation

答案 2 :(得分:47)

如果您想查看每次提交所引入的更改,请尝试“git log -p”

答案 3 :(得分:10)

我使用gitk来查看差异:

gitk k73ud..dj374

它具有GUI模式,因此审阅更容易。

答案 4 :(得分:10)

  1. gitk --all
  2. 选择第一次提交
  3. 右键单击,然后差异选择→此

答案 5 :(得分:6)

要查看两个不同提交之间的区别(让我们称之为ab),请使用

git diff a..b
  • 请注意,ab之间的差异与ba相反。

要查看上次提交和尚未提交的更改之间的差异,请使用

git diff

如果您希望以后能够恢复差异,可以将其保存在文件中。

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

答案 6 :(得分:3)

我编写了一个脚本,该脚本显示两次提交之间的差异,在Ubuntu上效果很好。

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)

答案 7 :(得分:2)

可接受的答案很好。

只需将其再次放在此处,即可轻松理解并在将来尝试

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

上述所有命令的区别都相同。

以上帮助
1.看到提交c1和另一个提交c2之间的区别
2.还制作一个显示diff的补丁文件,可用于将更改应用于另一个分支

如果未正确显示差异
那么c1和c2可能会出错
因此将它们调整为c1到c0之前的提交,或c2到c3之后的提交。

使用gitk查看提交SHA,第1个8个字符足以用作c0,c1,c2或c3。您还可以从Gitlab>存储库>提交等查看提交ID。

希望有帮助。

答案 8 :(得分:2)

我一直很喜欢使用命令行,并且手边有用户友好的工具(带有GUI)。两全其美。这是我在Git中比较两个提交的方法。

您可以如下所示显示两次提交之间的差异。

在文本编辑器中编辑git配置文件:

git config --global -e 

在Windows的Git配置文件中设置像这样的适当的差异工具(用户友好):

[difftool "meld"]
cmd = "C:/Program Files (x86)/Meld/Meld.exe" "LOCAL\" \"REMOTE" --label "DIFF (ORIGINAL MY)"
prompt = false
path = C:\Program Files (x86)\Meld\Meld.exe

可以使用Chocolatey在COMMAND LINE中安装字段,

choco install meld

让我们定义一个shell函数来帮助我们在TEXT EDITOR中的[alias]下比较两个sha-(commit):

[alias]
showchangesbetween = "!w() { git difftool \"$1\" \"$2\" --dir-diff --ignore-all-space; }; w"

要在Meld(或您最喜欢的差异工具)的帮助下比较提交,只需在COMMAND LINE中键入:

git showchangesbetween somesha123 somesha456

提交sha-s易于查看

 git log 

例如。

答案 9 :(得分:1)

最简单的检查拉出后最近2次提交中的更改:

git diff HEAD~2 

答案 10 :(得分:1)

下面的命令在 Ubuntu 20.04 和 git v2.25.1 上非常适合我:

git diff <base-commit-id> <target-commit-id>

答案 11 :(得分:1)

 1. git diff <commit-id> <commit-id>
 2. git diff HEAD^ HEAD     -(HEAD = current branch’s tip),( HEAD^ = version before the last commit)
 3. git diff HEAD^ HEAD — ./file     (comparison to specified file)
 4. git diff HEAD~5 HEAD           - (HEAD~5 refers to the last 5 commits.)

答案 12 :(得分:0)

假设您在底部(最旧的)还有一次提交,那么这变得很容易:

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

现在,使用下面的内容可以轻松实现目的。

git diff k73ud oldestCommit

答案 13 :(得分:-2)

使用此命令获取commit和unstaged之间的区别:

Integer.MAX_VALUE