有没有一种方法可以简单地在提交前加上交互式变基?

Is there a way to simply prepend a commit with interactive rebase?

假设我有一个基于 master 的分支,它以合并提交结尾:

--A---C<master]---D---E---F<my-feature]
   \ / 
    B

DE 之间使用交互式 rebase 添加提交 X 很简单 - 我 运行

git rebase -i master

,将提交 D 操作设置为 edit,rebase D 后 rebase 停止。我只是在那一刻创建新的提交,然后继续变基。分支现在看起来像

...C<master]---D---X---E'---F'<my_freature].

现在我想在 CD 之间添加一个提交。 期望的结果:

C<master]---X---D'---E'---F'<my_freature]

我试过了

git rebase -i master~

我想将合并提交 C 设置为 edit,但是交互式变基以某种方式忽略了合并提交 C 并且只提供链 A--B--D--E,所以变基导致合并提交丢失 C.

有没有一种简单的方法可以像这样使用交互式 rebase 预先提交对分支的提交?

请注意,我可以想出一个 更复杂的 解决方案,例如在 master 上创建新分支 tmp,并向其提交 X然后将 my-feature 变基到 tmp,我只是好奇是否有一种简单直接的交互式变基方法。

我刚刚成功重现了您的场景,并通过将 -p 选项 (--preserve-merges) 添加到 `git rebase:

在 C 和 D 之间插入了提交 X
git rebase -i -p master^

其余工作流程如您所述:告诉 rebase 编辑合并提交,手动插入新提交并以 git rebase --continue 结束。

顺便说一句,很棒的工作流程!我想我会用它。

编辑:我用 Git 2.4 测试了这个解决方案。如果你有更新版本的 Git,@torek 建议使用更安全的 --rebase-merges 选项而不是 --preserve-merges。请参阅下面的评论以获取解释。