【问题标题】:How does git keep track of the commit hash marked with a fixup/squash flag?git 如何跟踪标记有 fixup/squash 标志的提交哈希?
【发布时间】:2019-06-10 18:56:47
【问题描述】:

我知道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

对我来说,修复提交看起来与普通提交没有什么不同,只是注释前面有一个“修复!”。

我想知道 git 是如何以及在哪里跟踪 commit B 是一个标有 &lt;commit A's hash&gt; 的修复提交这一事实,如果有的话;如果是这种情况,是否有一个 git log 等效项允许我访问 &lt;commit A's hash&gt; 以及 commit B

谢谢!

【问题讨论】:

    标签: git rebase squash fixup


    【解决方案1】:

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

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

    我尝试了以下方法:

    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! &lt;commit message&gt;


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

    【讨论】:

    • 我可能默认启用了 autosquash。
    • 谢谢。你知道git commit --squash 是如何工作的吗?它如何在跟踪要合并的提交的同时保留评论?
    猜你喜欢
    • 2021-06-13
    • 2014-04-13
    • 2013-04-28
    • 2016-12-30
    • 2019-07-21
    • 2018-06-21
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多