查看文件之前版本的差异的速记方法

19
我可以使用git diff HEAD^ --<filename>轻松查找自上次提交以来某个文件发生了什么变化,但是是否有一个类似的简写方式来查看自最后一次提交以来某个文件的差异,而不管有多少次提交?或者回退那个特定文件的N次提交? 背景:我在一个文件中发现了一个错误,并希望找出它何时出现。 使用git log - <n><filename>很容易为特定文件获取日志报告,以仅显示包含对该文件进行更改的提交。 所以显然我只需从该log报告复制和粘贴SHAs,但我真正想要的是能够执行类似于git diff ^ -- <filename>git diff ~ 2 -- <filename>的操作。

2
你确定你不只是想要 git blame 吗? - Carl Norum
3个回答

43
$ git log -p <filename>

将向您显示每个触及命名文件的提交的日志消息和差异。

要仅显示与上一个版本的差异,请请求日志历史记录中的一个步骤:

$ git log -1 -p <filename>

1
我觉得这似乎是最接近 OP 所寻找的东西,但它仍然非常有用。谢谢。 - Kyle Strand
1
@MattMcHenry 真不错。我编辑了你的答案,并添加了语法,以显示最后一次提交中的更改,正如OP所要求的那样。 - Jan Vlcinsky

4
你可以利用git log格式化来获取先前提交的哈希值并将其保存到文件中。例如,
git log --pretty=format:'%h' -1 --skip=1 <filename>

这将为您提供特定文件的倒数第二个提交。事实上,如果您没有指定文件名,这将为您获取整个存储库中倒数第二个提交。要获取旧的哈希值,您可以设置一个调用 shell 函数的 git 别名,如下所示:

[alias]
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph"

要使用它,您需要输入类似于git prior-hash n <filename>的命令,其中n是该文件的(n+1)个最近版本。因此,1将是文件的倒数第二次提交,2将是倒数第三次提交等,而0将是最近一次触及该文件的提交。同样,如果您想要检查整个存储库,则文件名是可选的。
我相信您可以从中找到如何构建差异命令的方法:
[alias]
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph"
    diff-prev-easy = "!dp() { git diff $(git prior-hash $1 $2).. $2; }; dp"

这个命令与之前的哈希别名类似,使用方法为 git diff-prev-easy n <filename>。它会将文件的第(n+1)个最近版本与最新版本进行比较。如果你想要将第(n+1)个最近版本与第n个最近版本进行比较,只需要简单地更改一下命令:

[alias]
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph"
    diff-prev = "!dp() { git diff $(git prior-hash $1 $2)..$(git prior-hash $(($1 - 1)) $2) $2; }; dp"

同样的方式使用它:git diff-prev n <filename>

然而,需要注意的一个潜在问题是,git log按时间顺序列出提交记录,这可能不是你想要的。考虑以下历史记录:

1 - 2 - - - 4 - 5   master
      \       /
        3 - -       develop

我们的git diff-prev 1命令将产生提交4和5之间的差异,这是预期的。但是git diff-prev 2将显示提交3和4之间的差异,这可能是不希望看到的。

我不知道OP的情况,但这正是我所需要的。谢谢。 - Mark E. Hamilton

1

git blame 可以让你快速到达目的地。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接