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

时间:2012-04-16 14:59:55

标签: git git-diff

是否有可能让git在特定文件之间产生差异,因为它现在存在,并且在最后一次更改它之前存在?

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

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

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

3 个答案:

答案 0 :(得分:209)

使用git diff的一种方法是:

git diff <commit> <path>

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

所以问题的答案是:

git diff HEAD^^ myfile

答案 1 :(得分:177)

这确实存在,但它实际上是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(或类似)来计算干预修订数或确定哈希值的唯一方法提交。

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

信用到期的信用:

  • 由于this answer,我发现了log -p
  • 感谢FranciscoPuga和this answer向我展示--follow选项。
  • 感谢ChrisBetti提及-n 1选项和atatko提及-1变体。
  • 感谢sweaver2112,让我真正阅读文档并找出-p&#34;的含义&#34;语义。

答案 2 :(得分:6)

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

[little:~] $ clang++ --version
clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
[little:~] $ clang++ --std=c++14 -o foo list_init.cc
[little:~] $ ./foo
ctor 0x1dfec30
ctor 0x1dfec50
dtor 0x1dfec50
dtor 0x1dfec30
caught exception.
done.
[little:~] $ 

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