git如何跟踪带有fixup / squash标志标记的提交哈希?

时间:2019-01-16 16:25:11

标签: git rebase squash fixup

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

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

我尝试了以下操作:

  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试图修复我的第一个“初始”提交,这不是我之前告诉它修复的。

但是,如果我只是做HEAD~2,它表明:

pick bb4adbd initial
fixup 21e0572 fixup! initial

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


为什么要这样做,而不是记录SHA,可能是因为它可以在重新设置基准,挑选樱桃等情况下幸免于难。此外,可能没有真正的方式来记录此sha以适当的方式,因为如果它确实记录了已修复的提交的阴影,那么该记录将阻止重新设置基准,或者也必须对其进行修改。