与上次更改相比,git diff文件的差异

278

有没有办法让git生成一个特定文件的差异,使其与上次更改它之前的状态进行比较?

也就是说,如果我们知道:

$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit

使用git diff 456def myfile命令可以查看最近一次对myfile的修改。是否有可能在不使用git log的情况下进行相同操作,即查看123abc中发生了哪些变化?


17
我更喜欢使用git diff HEAD^ <file_path>命令。 - asgs
10
@asgs - 没有做我要求的事情(有两个原因- HEAD^123abcHEAD^^456def;如果有其他提交_没有影响到这个文件_,那么 HEAD^ 就会指向它们)。 - Chowlett
你说得对,我漏掉了“最后更改它的提交”。 - asgs
3个回答

270

这确实存在,但实际上是 git log 的一个功能:

git log -p [-m] [--follow] [-1] <path>

请注意,-p 还可用于显示单个提交的内联差异:

git log -p -1 <commit>

使用的选项:

  • -p(也可以使用-u--patch)被隐藏在git-log手册页的深处,实际上是git-diff的显示选项。在与log一起使用时,它显示将为每个提交生成的补丁以及提交信息,并且隐藏不涉及指定<path>的提交。 (这种行为在关于--full-diff的段落中描述,该段落会显示每个提交的完整diff。)
  • -m会导致合并提交包括差异内容(否则这些提交只显示提交消息,就像未指定-p一样)。
  • -1仅显示指定文件的最新更改(可以使用-n 1代替-1)。否则,该文件的所有非零diff都会显示出来。
  • 要查看重命名之前发生的更改,需要使用--follow

据我所知,这是立即查看文件的最后一组更改的唯一方法,而不使用git log(或类似工具),以计算介于两个版本之间的修订数,或确定提交的哈希值。

要查看旧版本的更改,请滚动日志,或指定从哪个提交或标记开始记录日志。 (当然,指定提交或标记会使您回到最初的难题,即找出正确的提交或标记是什么)。

功劳归于:

  • 我发现了log -p,感谢这个答案
  • Credit to FranciscoPuga and this answer for showing me the --follow option.
  • Credit to ChrisBetti for mentioning the -n 1 option and atatko for mentioning the -1 variant.
  • Credit to sweaver2112 for getting me to actually read the documentation and figure out what -p "means" semantically.
  • Credit to Oscar Scholten for pointing out that by default, -p does not show diff-contents for merge commits.

12
这对我来说是一个很好的解决方案。当我运行 git log -p 文件名 时,它展示了每个提交和其与当前文件的差异。 - Ian Jamieson
4
非常好。如果只想查看最后一次修改,只需添加"-n 1"参数即可。命令为:"git log -p -n 1 文件名". - Chris Betti
1
“-n 1”也可以被“-1”替换,这不会改变结果,只是我更喜欢这种语法:“git log -p -1 文件名” - atatko
1
@sweaver2112 从回答本身可以看出,我很乐意从有用的评论中融入新信息到我的回答中。与其抱怨,为什么不建议改进呢?你甚至可以编辑这个回答。 - Kyle Strand
1
有一个有用的选项“--skip=[n]”。您可以键入 git log -p -1 --skip=1 <path> 来显示第二个提交。 - Maciej Łoziński
显示剩余7条评论

235

使用 git diff 的方法之一是:

git diff <commit> <path>

一种常见的方法是,参考最新提交的一个提交,使用相对路径引用实际的HEAD。你可以以HEAD ^(在您的示例中,这将是123abc)或HEAD ^^(在您的示例中为456def)等方式引用先前的提交。

因此,对于您的问题的答案是:

git diff HEAD^^ myfile

7
哦,当然。我尝试了 HEAD^,但是当然没有产生任何结果。没想到要尝试 HEAD^^ - Chowlett
20
或许对于很久以前的提交,可以使用更简单的语法:HEAD~2 - ibizaman
22
至少对于Git 1.9.0而言,HEAD^^ myfile并不会真正指向修改myfile的倒数第二个提交,它将指向整个仓库中的倒数第二个提交。有没有办法指定“我想查看对这个文件最后一次的更改”,而不必指定(部分)提交哈希或计算从最后一次对该文件进行更改到当前修订版本之间的提交数量? - Kyle Strand
37
下降投票的原因:问题询问的是“在一个特定的文件现在存在的版本和在最后一次更改它之前存在的版本之间的差异”,但如果该文件在最后一次提交之前没有被更改,这个答案就不适用。 - Chris Betti
5
为什么这个被投票赞成了?它根本没有回答问题 >:( - gman
显示剩余9条评论

9
如果您喜欢使用图形化工具,这个方法非常有效:
gitk <file>

gitk现在显示了所有更新了该文件的提交记录。标记一个提交记录将会显示与列表中前一个提交记录之间的差异。这也适用于目录,但是您还需要选择要对所选提交记录进行差异比较的文件。非常有用!


1
还有一个非常有用的命令:git difftool HEAD^ file 或者 git difftool -d HEAD^ path - ForeverLearning

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