git diff文件的最新更改


236

是否有可能使git在特定文件之间产生差异,该文件现在已经存在,并且在最后一次更改之前存在。

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

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

然后git diff 456def myfile显示对myfile的最后更改。在没有产生知识的情况下可以做同样的事情git log; 123abc中发生了什么变化?


8
我更喜欢使用git diff HEAD^ <file_path>
-asgs

4
@asgs -不这样做,我问什么(有两个原因- HEAD^123abcHEAD^^456def,如果有其他的提交是没有影响该文件,然后HEAD^将他们比)
Chowlett

您是对的,错过了“更改了它的最后一次提交”部分
asgs

Answers:


215

确实存在,但实际上是以下功能git log

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

注意,-p它也可以用来显示单次提交的内联差异:

git log -p -1 <commit>

使用的选项:

  • -p(也是-u--patch)在git-log手册页中隐藏了deeeeeeeep,实际上是的显示选项git-diff。与一起使用时log,它会显示将为每个提交生成的补丁以及提交信息,并隐藏未触及指定的提交<path>。(此行为在的段落中进行了描述,该行为--full-diff将显示每个提交的完整差异。)
  • -1显示对指定文件的最新更改(-n 1可以使用代替-1);否则,将显示该文件的所有非零差异。
  • --follow 需要查看重命名之前发生的更改。

据我所知,这是立即查看对文件所做的最后一组更改的唯一方法,而无需使用git log(或类似方法)计算介入修订的数量或确定提交的哈希值。

要查看较旧的修订版本,只需滚动日志,或指定从中启动日志的提交或标记。(当然,指定提交或标记将使您回到原来的问题,弄清楚什么是正确的提交或标记。)

信用到期的地方:

  • 我发现log -p这个答案
  • 感谢FranciscoPuga,这个答案为我展示了该--follow选项。
  • 感谢ChrisBetti提到该-n 1选项,而atatko提到了该-1变体。
  • 感谢sweaver2112,它使我能够实际阅读文档并弄清-p语义上的“含义”。

6
对我来说,这是一个很好的解决方案。在我运行时显示了每次提交及其与当前文件的差异git log -p filename
Ian Jamieson 2014年

4
完善。仅查看最后的更改,就像添加-n 1参数一样简单。git log -p -n 1 filename
克里斯·贝蒂

@ChrisBetti谢谢;我已将其合并到我的答案中!
凯尔·斯特兰德

1
-n 1也可以替换为-1,它不会改变结果,我只喜欢语法:git log -p -1 filename
atatko

1
有一个有用的选项“ --skip = [n]”。您可以键入git log -p -1 --skip=1 <path>以显示第二个提交。
MaciekŁoziński17年

220

使用git diff的方法之一是:

git diff <commit> <path>

引用最后一次提交的一种常见方式是将其作为实际HEAD的相对路径。您可以将先前的提交引用为HEAD ^(在您的示例中为123abc)或HEAD ^^(在您的示例中为456def),等等。

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

git diff HEAD^^ myfile

6
哦当然了 我尝试过HEAD^,但是当然什么也没做。没想尝试HEAD^^
Chowlett

17
对于长期提交来说,语法可能更简单:HEAD~2
ibizaman 2013年

19
HEAD^^ myfile实际上对于Git 1.9.0而言)实际上是指更改的倒数第二个提交,这是不正确的myfile;它将引用总体上倒数第二个提交。有什么方法可以指定“我想查看对该文件所做的最后更改”,而无需指定提交哈希(的一部分)或计算对该文件进行的最后更改与当前修订之间的提交次数?
凯尔·斯特兰德

3
嗯,看起来git log -p很近。
Kyle Strand

30
否决的原因:该问题询问“在特定文件之间,以及在更改该文件的最后一次提交之前存在的特定文件之间”,但是如果文件在上次总体提交中未更改,则此答案无效。
克里斯·贝蒂

8

如果您使用图形工具很好,那么效果很好:

gitk <file>

gitk现在显示文件已更新的所有提交。标记为提交将显示与列表中先前提交的差异。这也适用于目录,但是随后您还可以选择要比较的文件,以用于选定的提交。超级有用!


1
也非常有用:git difftool HEAD^ filegit difftool -d HEAD^ path
ForeverLearning,2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.