有没有办法让git生成一个特定文件的差异,使其与上次更改它之前的状态进行比较?
也就是说,如果我们知道:
$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
使用git diff 456def myfile
命令可以查看最近一次对myfile的修改。是否有可能在不使用git log
的情况下进行相同操作,即查看123abc中发生了哪些变化?
这确实存在,但实际上是 git log
的一个功能:
git log -p [-m] [--follow] [-1] <path>
请注意,-p
还可用于显示单个提交的内联差异:
git log -p -1 <commit>
使用的选项:
-p
(也可以使用-u
或--patch
)被隐藏在git-log
手册页的深处,实际上是git-diff
的显示选项。在与log
一起使用时,它显示将为每个提交生成的补丁以及提交信息,并且隐藏不涉及指定<path>
的提交。 (这种行为在关于--full-diff
的段落中描述,该段落会显示每个提交的完整diff。)-m
会导致合并提交包括差异内容(否则这些提交只显示提交消息,就像未指定-p
一样)。-1
仅显示指定文件的最新更改(可以使用-n 1
代替-1
)。否则,该文件的所有非零diff都会显示出来。--follow
。据我所知,这是立即查看文件的最后一组更改的唯一方法,而不使用git log
(或类似工具),以计算介于两个版本之间的修订数,或确定提交的哈希值。
要查看旧版本的更改,请滚动日志,或指定从哪个提交或标记开始记录日志。 (当然,指定提交或标记会使您回到最初的难题,即找出正确的提交或标记是什么)。
功劳归于:
log -p
,感谢这个答案。--follow
option.-n 1
option and atatko for mentioning the -1
variant.-p
"means" semantically.-p
does not show diff-contents for merge commits.git log -p 文件名
时,它展示了每个提交和其与当前文件的差异。 - Ian Jamiesongit log -p -1 --skip=1 <path>
来显示第二个提交。 - Maciej Łoziński使用 git diff 的方法之一是:
git diff <commit> <path>
一种常见的方法是,参考最新提交的一个提交,使用相对路径引用实际的HEAD。你可以以HEAD ^(在您的示例中,这将是123abc)或HEAD ^^(在您的示例中为456def)等方式引用先前的提交。
因此,对于您的问题的答案是:
git diff HEAD^^ myfile
HEAD^
,但是当然没有产生任何结果。没想到要尝试 HEAD^^
。 - ChowlettHEAD~2
。 - ibizamanHEAD^^ myfile
并不会真正指向修改myfile
的倒数第二个提交,它将指向整个仓库中的倒数第二个提交。有没有办法指定“我想查看对这个文件最后一次的更改”,而不必指定(部分)提交哈希或计算从最后一次对该文件进行更改到当前修订版本之间的提交数量? - Kyle Strandgitk <file>
gitk现在显示了所有更新了该文件的提交记录。标记一个提交记录将会显示与列表中前一个提交记录之间的差异。这也适用于目录,但是您还需要选择要对所选提交记录进行差异比较的文件。非常有用!
git difftool HEAD^ file
或者 git difftool -d HEAD^ path
。 - ForeverLearning
git diff HEAD^ <file_path>
命令。 - asgsHEAD^
是123abc
,HEAD^^
是456def
;如果有其他提交_没有影响到这个文件_,那么HEAD^
就会指向它们)。 - Chowlett