git diff文件反对它的最后一次更改

git diff file against its last change

是否可以让Git在一个特定的文件(因为它现在存在)和在最后一次提交更改它之前就存在的文件之间产生差异?

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

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

然后,git diff 456def myfile显示对myfile的最后更改。在没有git log所产生的知识的情况下,是否有可能做到这一点;123abc发生了什么变化?


使用git diff的方法之一是:

1
git diff <commit> <path>

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

所以你的问题的答案是:

1
git diff HEAD^^ myfile


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

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

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

1
git log -p -1 <commit>

使用的选项:

  • -p(也叫-u--patch隐藏在git-log手册页中,实际上是git-diff的显示选项。当与log一起使用时,它显示将为每个提交生成的补丁,以及提交信息&mdash;并隐藏不接触指定的提交。(此行为在--full-diff上的段落中描述,这导致显示每个承诺的完全差异。)
  • -1只显示指定文件的最新更改(可以使用-n 1而不是-1;否则,显示该文件的所有非零差异。
  • 需要--follow查看重命名之前发生的更改。

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

要查看旧版本的更改,只需滚动日志,或指定从中启动日志的提交或标记。(当然,指定commit或tag会返回到最初的问题,即确定正确的commit或tag是什么。)

信用证到期:

  • 多亏这个答案,我才发现了log -p
  • 感谢Franciscopuga,这个答案让我看到了--follow选项。
  • Chrisbetti提到了-n 1选项,Atatko提到了-1变体。
  • 感谢Sweaver2112让我真正阅读文档,并弄清楚-p在语义上是什么意思。


如果您可以使用图形工具,这会很好地工作:

1
gitk <file>

现在,Gitk将显示文件已更新的所有提交。标记提交将显示与列表中以前提交的差异。这也适用于目录,但是您也可以为所选提交选择要diff的文件。非常有用!