在Git中生成特定提交的差异文件

33

当头部处于特定提交时,我希望获得一个差异文件,以便将头部降低一个级别,然后尝试在应用和未应用差异文件的情况下测试功能。因此,有没有一种方法可以生成特定提交的差异文件。

虽然有一种方法可以在提交之前和之后更改头部,但这种方法更方便。


你可以通过 git diff <commit-sha> -p 命令查看提交的更改。 - Sajib Khan
1
我不知道你在这里实际上在问什么,但是你可以比较任意两个提交:git diff commit1 commit2。你也可以将任意两个提交的 git diff 输出限制为指定的文件:例如 git diff c1 c2 -- path1 path2 - torek
4个回答

45

查看特定提交的更改:

git diff <commit-sha> -p

或者,

git show --decorate <commit-sha>    # See 'Author', 'Date' and 'diff'

查看两次提交之间的差异:

git diff <commit1> <commit2>

查看特定提交的文件更改:

git show <commit>:<file>

查看一段时间内(比如,1天)的所有更改:

git whatchanged --since="1 day ago" -p
git whatchanged --since="1 day ago" -p <file>   # See changes for a specific file only

1
git diff <commit-sha> -p 给我的结果和没有加上 -p 是完全一样的。也就是说,它显示了在该提交之后和当前工作目录之间的差异。 - undefined

16

如果我理解正确的话,您想要获取一个与HEAD下一级不同的文件。

要检查文件差异,从当前HEAD到之前一个级别:

git diff HEAD^1 filename

数字1代表你希望进行比较的级别。

您还可以使用SHA-1哈希来获取不同之处。要查看所有提交及其SHA-1,请使用:

git log --oneline

然后你可以使用SHA-1哈希来获取差异,用于将当前的HEAD与特定提交进行比较。使用:

git diff commitSHA filename

如果你想获取两个提交之间的所有差异,可以使用:

git diff commitSHA1..commitSHA2 filename

9

来自 gitrevisions(7):

r1^! 表示包含提交 r1,但排除了其所有父提交。单独使用此符号表示单个提交 r1。

这适用于显示单个提交的差异。例如,您可以执行以下操作:

git log --oneline | grep thingamabob

这将给出短的SHA-1哈希值,以便您可以查看该提交的差异:
git diff 'b7f57543^!'

2
我认为这是最有用的答案,因为它不需要你去查找2个哈希值或记住超过1个。 - soulshined
这个有效,谢谢!但是我对使用的术语感到困惑。r1^! 表示包括提交 r1 但不包括其所有父提交。难道这不应该是“不包括所有子提交”吗?当我执行 git diff <commit> 时,我看到的是来自 <commit> 和它的所有子提交(而不是父提交)的更改。因此,似乎所讨论的符号排除了其子提交的更改。 - Patrick

1
生成差异文件的方法是将输出转发到一个文件中。假设commit1是您想要生成差异的提交:
git diff <commit-before-commit1> <commit1> > commit1.diff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接