git 如何跟踪标有 fixup/squash 标志的提交散列?

How does git keep track of the commit hash marked with a fixup/squash flag?

我知道 git commit --fixup <commit A's hash> 可以在执行 git rebase -i --autosquash 时创建一个将与提交 A 合并的提交 B。

当我 运行 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

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

我想知道 git 如何以及在何处跟踪 commit B 是一个标记为 <commit A's hash> 的修复提交,如果它根本没有;如果是这样,是否有一个 git log 等价物允许我访问 <commit A's hash>commit B

谢谢!

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

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

我尝试了以下方法:

  1. 创建了一个新的存储库
  2. 做了一些提交
  3. 进行了 2 次提交,均带有消息 "initial"
  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 正在尝试修复我的第一个 "initial" 提交,这不是我之前告诉它修复的那个。

但是,如果我只是 HEAD~2,它会提示:

pick bb4adbd initial
fixup 21e0572 fixup! initial

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


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