首页 > 解决方案 > git 如何跟踪标记有 fixup/squash 标志的提交哈希?

问题描述

我知道git commit --fixup <commit A's hash>在执行git rebase -i --autosquash.

当我运行时git log,我的提交日志看起来像

commit <commit B's hash>
Author: xxx
Date:   xxx

fixup! commit A's comment

commit <commit A's hash>
Author: xxx
Date:   xxx

commit A's comment

对我来说,修复提交看起来与普通提交没有什么不同,除了评论前面有一个“修复!”。

我想知道 git 如何以及在何处跟踪commit B标记为 的修复提交<commit A's hash>这一事实,如果有的话;如果是这样的话,是否有一个git log等价物可以让我一起<commit A's hash>访问commit B

谢谢!

标签: gitrebasesquashfixup

解决方案


(免责声明:此答案基于观察)

它不会跟踪要修复的提交,它会在您执行变基时查找它并使用提交消息来找到正确的提交。

我尝试了以下方法:

  1. 创建了一个新的存储库
  2. 做了一些提交
  3. 进行了 2 次提交,均带有“初始”消息
  4. 然后我做了一个修复提交,修复了这两个中的最后一个

    git commit --fixup bb4adbd
    

日志现在如下所示:

λ git lg
* 21e0572: (5 minutes ago) fixup! initial (HEAD -> master)
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:32:51 +0100)
|
* bb4adbd: (5 minutes ago) initial
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:32:38 +0100)
|
* e6549e4: (9 minutes ago) initial
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:28:59 +0100)
|
* a311a82: (9 minutes ago) second
| Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:28:12 +0100)
|
* 2a5ca27: (10 minutes ago) initial
  Lasse Vågsæther Karlsen <lasse@vkarlsen.no> (Wed, 16 Jan 2019 17:27:12 +0100)

如果我这样做:

git rebase -i HEAD~3

然后 git 建议:

pick e6549e4 initial
fixup 21e0572 fixup! initial
pick bb4adbd initial

这里 git 正在尝试修复我的第一个“初始”提交,这不是我之前告诉它修复的那个。

但是,如果我只是这样做HEAD~2,则表明:

pick bb4adbd initial
fixup 21e0572 fixup! initial

这意味着 git 根本不会跟踪这是关于哪个提交,它只是fixup! <commit message>在修复提交的提交消息的末尾记录 a 。


关于它为什么这样做而不是记录 SHA 的猜测是,这将在 rebase、cherry-pick 等中幸存下来。此外,这可能是在没有真正的方式以适当的方式记录此 sha 的情况下添加的方式,因为如果它确实记录了它修复的提交的 sha,那么该记录将阻止变基,或者也必须进行修改。


推荐阅读