git diff 文件针对其最后一次更改
Posted
技术标签:
【中文标题】git diff 文件针对其最后一次更改【英文标题】:git diff file against its last change 【发布时间】:2012-04-27 22:17:53 【问题描述】:是否有可能让 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 diff HEAD^ <file_path>
@asgs - 没有按照我的要求做(有两个原因 - HEAD^
是 123abc
,HEAD^^
是 456def
;如果还有其他提交 没有影响这个文件然后HEAD^
引用他们)
你是对的,错过了“改变它的最后一次提交”部分
【参考方案1】:
这确实存在,但它实际上是git log
的一个特性:
git log -p [-m] [--follow] [-1] <path>
请注意,-p
也可用于显示单个提交的内联差异:
git log -p -1 <commit>
使用的选项:
-p
(也称为-u
或--patch
)隐藏在git-log
手册页中,实际上是git-diff
的显示选项。当与log
一起使用时,它会显示为每个提交 生成的补丁,以及提交信息——并且隐藏 不触及指定@987654333 的提交@。 (此行为在--full-diff
的段落中进行了描述,这会导致显示每个提交的完整差异。)
-m
导致合并提交包含差异内容(否则这些仅显示提交消息,就好像未指定 -p
一样)。
-1
显示只是对指定文件的最新更改(-n 1
可以用来代替-1
);否则,将显示该文件的所有个非零差异。
需要--follow
才能查看重命名之前发生的更改。
据我所知,这是无需使用git log
(或类似方法)即可立即查看对文件所做的最后一组更改的唯一方法,以计算干预修订的数量或确定文件的哈希值提交。
要查看旧版本的更改,只需滚动浏览日志,或指定从其开始日志的提交或标记。 (当然,指定提交或标签会让您回到原来的问题,即找出正确的提交或标签是什么。)
信用到期:
感谢this answer,我发现了log -p
。
感谢 FranciscoPuga 和 this answer 向我展示了 --follow
选项。
感谢 ChrisBetti 提到 -n 1
选项和 atatko 提到 -1
变体。
感谢 sweaver2112 让我真正阅读文档并弄清楚 -p
的“语义”含义。
感谢 Oscar Scholten 指出默认情况下,-p
不显示合并提交的差异内容。
【讨论】:
这对我来说是一个很好的解决方案。当我运行git log -p filename
时,显示了每个提交及其与当前文件的差异
完美。要查看最后的更改,只需添加-n 1
参数即可。 git log -p -n 1 filename
@ChrisBetti 谢谢;我已将其纳入我的答案!
-n 1
也可以替换为-1
,不会改变结果我只是更喜欢语法:git log -p -1 filename
有一个有用的选项“--skip=[n]”。你可以输入git log -p -1 --skip=1 <path>
来显示第二次提交。【参考方案2】:
如果您可以很好地使用图形工具,这将非常有效:
gitk <file>
gitk 现在显示文件已更新的所有提交。标记提交将向您显示与列表中上一个提交的差异。这也适用于目录,但是您还可以选择要对所选提交进行比较的文件。超级好用!
【讨论】:
也很有用:git difftool HEAD^ file
or git difftool -d HEAD^ path
【参考方案3】:
使用 git diff 的方法之一是:
git diff <commit> <path>
引用最后一次提交的一个提交的常用方法是作为实际 HEAD 的相对路径。您可以将以前的提交引用为 HEAD^(在您的示例中为 123abc)或 HEAD^^(在您的示例中为 456def)等...
所以你的问题的答案是:
git diff HEAD^^ myfile
【讨论】:
哦,当然。我试过HEAD^
,但当然没有产生任何结果。没想到要试试HEAD^^
。
对于很久以前的提交可能更简单的语法:HEAD~2
HEAD^^ myfile
实际上是指更改 myfile
的倒数第二个提交,这不是真的(至少对于 Git 1.9.0);它将指整体倒数第二个提交。有没有办法指定“我想查看对该文件所做的最后一次更改”而不指定(部分)提交哈希或计算对 该文件 的最后一次更改之间的提交次数和当前版本?
downvote 原因:问题询问“在当前存在的特定文件与 上次更改它的提交之前存在的特定文件之间”,但如果该文件不是在最后一次整体提交中发生了变化,这个答案不起作用。
为什么要投票?它无法回答所提出的问题>:(以上是关于git diff 文件针对其最后一次更改的主要内容,如果未能解决你的问题,请参考以下文章