265

是否有可能让 git 在当前存在的特定文件与上次更改它的提交之前存在的特定文件之间产生差异?

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

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

然后git diff 456def myfile显示对 myfile 的最后更改。git log如果没有由;产生的知识,是否可以做同样的事情 123abc 发生了什么变化?

4

3 回答 3

258

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

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

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

git log -p -1 <commit>

使用的选项:

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

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

要查看旧版本的更改,只需滚动日志,或指定从其开始日志的提交或标记。(当然,指定提交或标签会让您回到原来的问题,即找出正确的提交或标签是什么。)

信用到期的信用:

  • 我发现log -p感谢这个答案
  • 感谢FranciscoPuga,这个答案向我展示了这个--follow选项。
  • 感谢 ChrisBetti 提到该-n 1选项和 atatko 提到该-1变体。
  • 感谢 sweaver2112 让我真正阅读文档并找出-p语义上的“含义”。
  • 感谢 Oscar Scholten 指出默认情况下,-p合并提交不显示差异内容。
于 2014-03-14T17:47:49.627 回答
226

使用 git diff 的方法之一是:

git diff <commit> <path>

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

所以你的问题的答案是:

git diff HEAD^^ myfile
于 2012-04-16T15:08:34.660 回答
9

如果您可以很好地使用图形工具,则效果很好:

gitk <file>

gitk 现在显示文件已更新的所有提交。标记提交将向您显示与列表中上一个提交的差异。这也适用于目录,但是您还可以选择要对所选提交进行比较的文件。超级好用!

于 2016-08-17T18:20:35.800 回答