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

Cho*_*ett 221 git git-diff

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

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

$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
Run Code Online (Sandbox Code Playgroud)

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

Fra*_*uga 215

使用git diff的方法之一是:

git diff <commit> <path>
Run Code Online (Sandbox Code Playgroud)

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

所以你的问题的答案是:

git diff HEAD^^ myfile
Run Code Online (Sandbox Code Playgroud)

  • downvote reason:问题是"在现有的特定文件之间,以及在最后一次更改it_的提交之前存在的文件",但是如果文件在上次整体提交中没有更改,则此答案不起作用. (23认同)
  • 至少对于Git 1.9.0来说,"HEAD ^^ myfile"实际上是指改变了`myfile`的倒数第二次提交; 它将引用整个倒数第二个提交.是否有任何方法可以指定"我想查看对此文件所做的最后一次更改",而无需指定(部分)提交哈希值或计算对该文件*的最后一次更改与当前修订版之间的提交次数? (18认同)
  • 对于很久以前提交的语法可能更简单:`HEAD~2` (17认同)
  • 哦,当然.我试过`HEAD ^`,但当然没有产生任何东西.没想到尝试`HEAD ^^`. (6认同)
  • 嗯,看起来像`git log -p`非常接近. (3认同)
  • 为什么这个被投票?它没有办法回答问题> :( (3认同)
  • @KyleStrand 有点奇怪/令人惊奇,像这样的问题花了整整两年的时间来回答。同样奇怪的是“足够接近”但是......我认为错误的答案得到了这么多的支持。 (2认同)

Kyl*_*and 201

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

git log -p [--follow] [-1] <path>
Run Code Online (Sandbox Code Playgroud)

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

git log -p -1 <commit>
Run Code Online (Sandbox Code Playgroud)

使用的选项:

  • -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语义上的"意思".

  • 这对我来说是个很好的解决方案.当我运行`git log -p filename`时,显示每个提交及其与当前文件的差异 (5认同)
  • 完善.要查看最后一次更改,就像添加`-n 1`参数一样简单.`git log -p -n 1 filename` (4认同)

Mar*_*n G 6

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

gitk <file>
Run Code Online (Sandbox Code Playgroud)

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