在最后一次“拉”或“合并”之前引用 HEAD 的状态

Reference a the state of HEAD before the last `pull` or `merge`

我发现我经常这样做。

我想知道是否有一种方法可以指定“HEAD 在最后一次拉取或合并之前的状态”,这样我就可以简单地总是 运行 相同的命令

git log -p HEAD@{before pull}..HEAD

总是使用 HEAD@{1} 很接近并且可能适用于 git pull,但不适用于 git pull --rebase,因为这会向 reflog 添加多个条目:

$ git reflog
4111cc6 (HEAD -> master) HEAD@{0}: rebase finished: returning to refs/heads/master
4111cc6 (HEAD -> master) HEAD@{1}: pull --rebase: A local commit
b795f99 (origin/master, origin/HEAD) HEAD@{2}: pull --rebase: checkout b795f9924503c05da91b08e0e9ad3ffb48229bc8
d3379e5 HEAD@{3}: commit: A local commit

一种替代方法是使用分支引用日志。 HEAD reflog 在 rebase 期间获得多个条目,但分支 reflog 应该在最后获得一个。 (至少在我的测试中有效。)所以它不完全是 "one command that's always the same",而是

git diff master@{1}..master

更接近你想要的。

另一种选择是使用 time-based reflog 表示法。例如,如果您知道 HEAD 过去没有移动,比如 5 分钟,那么在 rebase 之后您可以立即说

git diff HEAD@{5.minutes.ago}..HEAD

而且只要在第一次更新到HEAD后的5分钟内没有奇怪的slow-down,这应该就可以了。但当然,如果 rebase 导致冲突解决,可能会有这样的 slow-down,总的来说,这是一个 half-baked 解决方案,我提到它只是因为它可能 通常 使用命令之间的差异较小...

你可以记下合并前的系统时间,然后说

git diff HEAD@{10:25:03}

避免依赖变基时间。但现在您又要记录一个值以插入命令。

[update - 删除了我最初提到的一个选项,因为它并没有真正做正确的事情;今天上班感冒了,头有点晕。]