显示提交之间的差异

Show diff between commits

提问人:ant2009 提问时间:7/30/2010 最后编辑:Peter Mortensenant2009 更新时间:6/8/2023 访问量:603138

问:

我在 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
git git-diff

评论


答:

526赞 VonC 7/30/2010 #1

尝试

git diff k73ud^..dj374

以确保在生成的差异中包含所有更改。k73ud

git diff 比较两个端点(而不是提交范围)。 由于 OP 希望看到 引入的更改,因此他们需要区分 k73ud 的第一个父提交:k73ud^(或 k73ud^1 或 k73ud~)。k73ud

这样,结果将包括自父级以来的更改(即包括来自自身的更改),而不是(最多)以来引入的更改。diffk73udk73udk73uddj374

您也可以尝试:

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

评论

6赞 ceth 7/30/2010
是否确定?git diff 275e8922ab4e995f47a753b88b75c3027444a54c..a8d9d944c32e945cbb9f60b3f724ecc580da86ae 有效,但 git diff 275e8922ab4e995f47a753b88b75c3027444a54c^..a8d9d944c32e945cbb9f60b3f724ecc580da86ae 获取错误消息 - “未知版本或路径不在工作树中”
1赞 VonC 7/30/2010
@demas:适用于我的机器;)您也可以使用,因为它与“”相同。git diff 275e8^ a8d9d9..
4赞 xi.lin 8/11/2014
@VonC 在我的机器中,没有必要使用 ^
5赞 xi.lin 8/11/2014
@VonC Ubuntu 14.04。只有没关系git diff k73ud..dj374
1赞 VonC 5/29/2020
@BradyDowling同意了。如果您想查看 PR 差异,可以使用新的 CLI 在命令行中执行此操作:stackoverflow.com/a/62031065/6309gh
71赞 cxreg 7/30/2010 #2

如果你想看到每次提交时引入的更改,请尝试“git log -p”

评论

2赞 David 天宇 Wong 6/20/2021
MVP!现在,如何在两个特定的哈希值之间执行此操作?并颠倒过来(从旧的到最近的)?!git log -p --reverse old_hash..new_hash
11赞 user2647616 8/3/2013 #3

我曾经看到差异:gitk

gitk k73ud..dj374

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

178赞 Alex Yursha 4/1/2015 #4

要查看以下两者之间的区别:

您的工作副本和暂存区域:

% git diff

暂存区域和最新提交:

% git diff --staged

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

% git diff 4ac0a6733

提交 4ac0a6733 和最新提交:

% git diff 4ac0a6733 HEAD

提交 4ac0a6733 并提交826793951

% git diff 4ac0a6733 826793951

有关更多解释,请参阅官方文档

评论

15赞 michael 9/25/2017
此外,如果您真的只想在这些提交中查看一个文件的差异,那么这些示例中的任何位置和位置。另请参阅,因为存在一些重叠。git diff {x} {y} -- filename{x}{y}git log -p
12赞 AldaronLau 9/21/2015 #5

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

git diff a..b
  • 请注意,和 之间的差值与 和 相反。abba

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

git diff

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

git diff a..b > ../project.diff
16赞 geekbytes0xff 2/11/2016 #6
  1. gitk --all
  2. 选择第一个提交
  3. 右键单击另一个,然后 diff 选择→

评论

1赞 Ciasto piekarz 2/9/2018
我开始不那么信任 gitk,因为它显示的提交者作者与实际作者不同。
-2赞 Annadurai 6/6/2017 #7

使用以下命令了解 commit 和 unstaged 之间的区别:

git difftool --dir-diff
4赞 Jacob Abraham 7/2/2018 #8

我写了一个脚本,显示两个提交之间的差异,在 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)
11赞 Flowkap 9/14/2018 #9

最简单的方法是检查拉取后最后 2 次提交中的更改:

git diff HEAD~2 

评论

1赞 SwissNavy 8/19/2020
对我来说,这在最后一次提交到倒数第二个(拉动后)之间做了一个差异:。git diff HEAD~1
0赞 bit_cracker007 1/30/2019 #10

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

commit dj374
made changes

commit y4746
made changes

commit k73ud
made changes

commit oldestCommit
made changes

现在,使用下面将很容易达到目的。

git diff k73ud oldestCommit
3赞 Manohar Reddy Poreddy 5/3/2020 #11

接受的答案是好的。

只是把它再放在这里,所以它很容易理解,将来会尝试

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 之间的区别。还制作了一个显示差异的补丁文件,并可用于将更改应用于另一个分支

如果它没有正确显示差异,
那么 c1 和 c2 可能是错误的
,所以将它们调整为提交前的 c1 到 c0,或者像 c2 到 c3 这样的提交后

用于查看提交 SHA,前 8 个字符足以将它们用作 c0、c1、c2 或 c3。您还可以从 Gitlab > Repository > Commit 等查看提交 ID。gitk

希望能有所帮助。

4赞 Tore Aurstad 12/10/2020 #12

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

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

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

git config --global -e 

在 Git 配置文件中设置一个适当的 diff 工具(用户友好),例如在 Windows 中像这样 Meld:

[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

Meld 可以在命令行中使用 Chocolatey 安装,如下所示:

choco install meld

让我们定义一个 shell 函数来帮助我们比较文本编辑器中 [alias] 下的两个 sha-s(提交):

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

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

git showchangesbetween somesha123 somesha456

提交 sha-s 很容易看到键入

 git log 

例如。

2赞 Muhammed Bera Koç 3/3/2021 #13

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

git diff <base-commit-id> <target-commit-id>
9赞 Ritu Gupta 6/8/2021 #14
 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.)
1赞 Matoeil 1/25/2023 #15

对于最后两次提交

git diff HEAD~1 HEAD

通过扩展来比较 2 个提交,例如

git diff HEAD~6 HEAD~3