Git:编辑其他父级的提交消息

时间:2018-04-11 15:18:50

标签: git git-merge amend

我必须编辑合并提交的父级的提交消息(父级实际上是一个合并)。我该怎么做?

这里F是我当前的HEAD,是E和D合并的结果.D本身是A和C合并的结果,D是我需要编辑的消息的提交。

  ...A-D-F - branch where I work
      / /
...B-C-E   - master

git rebase -i D~只显示来自主人的提交进行编辑--E,C,B ......

没有一个被推。有希望吗?

1 个答案:

答案 0 :(得分:0)

默认情况下,rebase会尝试生成线性历史记录。此外,rebase假定所有更改都在非合并提交中表示(除了冲突解决方案或"邪恶合并",应该为真)。

有两点需要注意,您可以使用rebase选项说服--preserve-merges确认合并提交。警告是:

1)rebase仍然无法正确处理合并中所做的更改。它将尝试使用默认策略重新创建合并,并允许您在必要时重新解决冲突。如果合并是使用--no-commit创建的,以便手动更改内容,即使它不会发生冲突,rebase也会默默地更改结果。

2)将--preserve-merges-i混合通常不安全。在具体情况下,可以这样做,如果您小心谨慎地将您正在做的事情限制在需要完成的工作中,那么这是可行的。

因此您可以尝试使用--preserve-merges执行rebase并在TODO列表中更改 nothing ,除了将D的命令设置为" reword"

这将替换提交DF,因此如果其他引用指向其中任何一个,您也必须移动这些引用。但是,由于没有任何推动,重写不应该引起任何其他重大问题。

还有其他方法可以进行重写,所以如果--preserve-merges不适合你(或者如果你不想弄乱它),你可以使用{{ 1}}而不是git filter-branch。但是,这很难设置,因为您需要编写一个脚本来转换--msg-filter消息,同时传递任何其他提交消息。见https://git-scm.com/docs/git-filter-branch

或者您可以手动重建历史记录。例如,如果您知道DD是非冲突的默认合并,则可以说

F

如果您不确定提交是非冲突的默认合并,您可以执行类似

的操作
git checkout myBranch
git reset --hard HEAD~2
git merge master^
# enter the new commit message for D
git merge master
# re-enter the commit message for E