我可以使用
git diff HEAD^ -- <filename>
轻松找出自上次提交以来文件发生了什么变化,但是 是否有等效的简写方式可以查看自上次提交以来特定文件的差异,无论此后发生了多少次提交?或者返回该特定文件的 N 次提交?
上下文:我在文件中发现了一个错误,我想追踪它何时潜入。使用
git log -<n> <filename>
获取特定文件的日志报告非常简单,仅显示包含对该文件的更改的提交。很明显,我可以从 log
报告中复制并粘贴 SHA,但我真正想要的是能够执行类似 git diff ^ -- <filename>
或 git diff ~2 -- <filename>
之类的操作。
git log -p <filename>
将向您显示日志消息以及触及指定文件的每个提交的差异。
要仅显示与先前版本的差异,请仅要求日志历史记录中的一个步骤:
git log -1 -p <filename>
您可以利用
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 将是最近一次接触该文件的提交。同样,如果您想检查整个存储库,文件名是可选的。
我相信你可以弄清楚如何从那里构建 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 之间的差异,这可能是不可取的。
git blame
应该可以让您很快到达目的地。