19

我可以很容易地找出自上次提交以来文件的更改,git diff HEAD^ -- <filename>但是是否有等效的速记来查看自上次提交以来特定文件的差异,无论此后发生了多少次提交?或者返回那个特定文件的 N 次提交?

上下文:我在一个文件中发现了一个错误,我想在它潜入时追踪它。获取特定文件的日志报告很容易,git log -<n> <filename>只显示包含对该文件的更改的提交。很明显,我可以从该log报告中复制并粘贴 SHA,但我真正想要的是能够执行类似git diff ^ -- <filename>or的操作git diff ~2 -- <filename>

4

3 回答 3

43
$ git log -p <filename>

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

要仅显示与以前版本的差异,只需在日志历史记录中询问一步:

$ git log -1 -p <filename>
于 2013-01-22T21:09:12.910 回答
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 将是最近一次提交到该文件。同样,如果您想从整体上检查 repo,文件名是可选的。

我相信你可以弄清楚如何从那里构建一个 diff 命令:

[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 之间的差异,这可能是不可取的。

于 2014-06-26T23:25:01.050 回答
1

git blame应该可以让您很快到达目的地。

于 2013-01-22T21:50:14.887 回答