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^123abcHEAD^^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 &lt;path&gt; 来显示第二次提交。【参考方案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 文件针对其最后一次更改的主要内容,如果未能解决你的问题,请参考以下文章

sh git diff list只更改了文件的名称

列出其更改(差异)包含给定字符串的文件? [复制]

Git:将单个文件还原为其最后一次提交[重复]

我可以让“git diff”只显示行号和更改的文件名吗?

如何在保留更改的同时撤消最后一次 git 提交? [复制]

如何撤消 git 中的最后一次提交,但保持我的更改未暂存?