【问题标题】:git rebase: fixup commits but use latest messagegit rebase:修复提交但使用最新消息
【发布时间】:2018-08-23 11:05:45
【问题描述】:

我知道如何将提交压缩在一起并丢弃消息:

pick A do thing
pick B debug
fixup C more debugging
pick D do another thing

这将导致 3 个提交,其中 2 个调试提交被压缩为一个,并带有“调试”消息。但是,我想知道是否有一种简单的方法来fixup 提交,但使用 LATEST 消息,而不是最早的消息。例如:

p A do thing
p B debug 1
f C debug 2
f D fix bug. #also remove debug statements

通过运行上述操作,我将得到一个修复错误的提交,并且不会有任何调试语句的残余。问题是该提交将具有“调试 1”的注释。我希望它有“修复错误”的信息。我知道我可以reword 提交,但这会打开编辑器,并迫使我重新输入提交消息。我尝试在变基文件中改写和复制消息,但是当reword 编辑器打开时,它仍然有旧消息。

是否可以fixup 提交但使用最新消息,或者在变基编辑器中修改提交消息,而不必为我想要reword 的每个单独提交打开编辑器?

【问题讨论】:

  • 不,这违背了fixup 的明确定义。您可以使用squash,然后删除除最后一条(您要保留的)之外的所有提交消息
  • @Amit 基本上会导致相同的结果。我必须为每个提交打开编辑器并手动更改消息

标签: git rebase


【解决方案1】:

考虑到“rebase -i”正在通过新选项得到增强,请检查最新的 Git 2.32(2021 年第二季度)是否有帮助。

请参阅commit 2c0aa2ccommit bae5b4acommit 1d410cdcommit 9e3cebdcommit 71ee81ccommit ae70e34(2021 年 1 月 29 日)Charvi Mendiratta (charvi-077)
请参阅Phillip Wood (phillipwood)commit 7cdb968(2021 年 1 月 29 日)和 commit 498bb5bcommit eab0df0(2021 年 1 月 19 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit ce4296c,2021 年 3 月 26 日)

rebase -i:添加fixup [-C | -c]命令

原创补丁作者:Phillip Wood
指导者:Christian Couder
指导者:Phillip Wood
签字人:Charvi Mendiratta

fixup 命令添加选项以修复提交内容和消息。

  • fixup -C 命令用于替换原来的提交信息和
  • fixup -c,还允许编辑提交消息。

结合:

rebase -i:教 --autosquashamend! 一起工作

原创补丁作者:Phillip Wood
指导者:Christian Couder
指导者:Phillip Wood
签字人:Charvi Mendiratta

如果提交主题以“amend!”开头,则将其重新排列为“fixup!”提交并将pick 命令替换为fixup -C 命令,该命令用于修复内容(如果有)并将原始提交消息替换为amend! 提交的消息。

git rebase -i documentation 现在改为:

如果要将两个或多个提交合并为一个,请替换命令 “pick”用于第二次和后续提交,使用“squash”或“fixup”。

如果提交有不同的作者,折叠的提交将是 归因于第一次提交的作者。

折叠提交的建议提交消息是第一个的串联 提交的消息与那些由“squash”命令标识的消息,省略 由“fixup”命令标识的提交消息,除非“fixup -c” 已使用。
在这种情况下,建议的提交消息只是“fixup -c”提交的消息,并且会打开一个编辑器,允许您编辑该消息。
fixup -c”提交的内容(补丁)仍然 合并到折叠提交中。
如果有多个“fixup -c”提交,则使用最后一个提交的消息。

您也可以使用“fixup -C”来获得与“fixup -c”相同的行为,但无需打开编辑器。

git rebase -i 包括(来自commit f07871d):

f, fixup [-C | -c] <commit>

类似于“squash”,但只保留前一次提交的日志消息,除非使用了-C,在这种情况下只保留这次提交的消息;
-c-C 相同,但会打开编辑器\n"

【讨论】:

    【解决方案2】:

    对于它的价值,我找到的最佳方法是在运行“git rebase --interactive --autosquash”后简单地编辑变基文件并将“fixup”替换为“squash”(或简单地“s”) .

    这将连接两个提交消息并允许您编辑最终消息。

    【讨论】:

      【解决方案3】:

      我认为你真的别无选择。但是,您可以使用 squash,而不是使用 fixup & reword

      p A do thing
      p B debug 1
      s C debug 2
      s D fix bug. #also remove debug statements
      

      您将打开编辑器,其中包含您可以编辑的三个首次提交消息。

      没有变基

      您也可以使用 reset 以其他方式执行此操作。

      # To clean the workspace before by saving the state
      git stash
      git reset --soft HEAD~3
      # To restore the saved state before the reset operation
      git commit -am 'fix bug'
      git stash pop
      

      使用此解决方案,编辑器将无法打开

      【讨论】:

        【解决方案4】:

        在 rebase 开始时更改你的待办事项列表以反转提交到 fixup 的顺序:

        pick A do thing
        pick C more debugging
        fixup B debug
        pick D do another thing
        

        【讨论】:

        • 这似乎可能会导致冲突。例如,在我描述的情况下,删除调试行的提交将出现在添加它们的提交之前
        • 你想要的不是那么容易做到的,反正你也得做点手工。你只需要决定在什么情况下劳动力更少。
        猜你喜欢
        • 2010-12-25
        • 2023-03-24
        • 2017-07-04
        • 2021-10-05
        • 1970-01-01
        • 2015-11-09
        • 1970-01-01
        • 2020-12-04
        • 2023-01-13
        相关资源
        最近更新 更多