在最后一次`pull`或`merge`

时间:2018-03-15 14:22:08

标签: git git-log git-reflog

我发现我经常这样做。

  • 运行git pullgit pull --rebase
  • 查看标准输出以查看更改

    From github.com:foo/bar
       3d8749e..b795f99  master  -> origin/master
    
  • 复制'n'将此版本范围粘贴到

    git log -p 3d8749e..b795f99
    

我想知道是否有办法在最后一次拉动或合并之前指定“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

1 个答案:

答案 0 :(得分:2)

另一种方法是使用分支reflog。 HEAD reflog在rebase期间获取多个条目,但是分支reflog应该在结尾处获得一个。 (至少在我的测试中起作用。)所以它并不完全是“一个总是相同的命令”,但是

git diff master@{1}..master

更接近你想要的。

另一种选择是使用基于时间的reflog表示法。例如,如果您知道HEAD过去没有移动过,比如说5分钟,那么就可以在改造之后立即说出

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

并且只要在第一次更新HEAD后5分钟内没有任何奇怪的减速,这应该没问题。但是当然如果rebase导致冲突解决,可能会有这么慢,总的来说这是一个半生不熟的解决方案,我之所以提到它只是因为它可能 usuall 命令之间的差异较小......

您可以在合并之前记下系统时间,并说出

git diff HEAD@{10:25:03}

以避免取决于rebase时间。但是现在你又回到录制一个值来插入命令。

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