是否可以让 Git 在当前存在的特定文件与上次更改它之前存在的文件之间生成差异?
也就是说,如果我们知道:
git log --oneline myfile
输出:
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit
然后
git diff 456def 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
的段落中进行了描述,这会导致显示每个提交的完整差异。)
-m
导致合并提交包含差异内容(否则这些仅显示提交消息,就好像未指定
-p
一样)。
-1
显示仅对指定文件的最新更改(可以使用
-n 1
代替
-1
);否则,将显示该文件的所有非零差异。 需要
--follow
才能查看重命名之前发生的更改。
git log
(或类似的)来计算干预修订的数量或确定提交的哈希值。要查看旧版本的更改,只需滚动日志,或指定从中启动日志的提交或标签。 (当然,指定提交或标签会让您回到最初的问题,即找出正确的提交或标签是什么。)
信用到期的信用:
git diff <commit> <path>
引用最后一次提交的一个常见方法是作为实际 HEAD 的相对路径。您可以将以前的提交引用为 HEAD^ (在您的示例中为 123abc)或 HEAD^^ (在您的示例中为 456def)等...
所以你的问题的答案是:
git diff HEAD^^ myfile
gitk <file>
gitk 现在显示文件已更新的所有提交。标记提交将向您显示与列表中先前提交的差异。这也适用于目录,但是您还可以选择要为所选提交进行比较的文件。超级有用!