Git 有没有一种方法可以简单地用交互式重新基址预先完成提交?

Git 有没有一种方法可以简单地用交互式重新基址预先完成提交?,git,git-interactive-rebase,Git,Git Interactive Rebase,假设我有一个基于master的分支,以merge commit结尾: --A---C<master]---D---E---F<my-feature] \ / B --A--C我刚刚成功地复制了您的场景,并通过将-p选项(--preserve merges)添加到`git rebase: git rebase -i -p master^ 工作流的其余部分如您所述:告诉rebase编辑合并提交,手动插入新提交,然后使用git-rebase完成—继续 顺便说一句,很酷的

假设我有一个基于master的分支,以merge commit结尾:

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

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

git rebase -i -p master^
工作流的其余部分如您所述:告诉rebase编辑合并提交,手动插入新提交,然后使用
git-rebase完成—继续

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


编辑:我用Git2.4测试了这个解决方案。如果您有较新版本的Git,@torek建议使用更安全的
--rebase merges
选项,而不是
--preserve merges
。有关解释,请参见下面的注释。

这是一个有趣的工作流。我不想首先在重新基础操作的中间添加一个新的提交。我不知道你的问题的答案,但我的方法是在F之后创建commit X,然后在C和D之间或D和E之间交互地重新设置它的位置,不管它在哪里,重定基址对合并不友好:它让我感到沮丧,你无法将A^..F重定基址到另一个分支,而不丢失历史上有过合并的事实。我以前想做这件事的时候用过手工采摘和重做合并。好的,我应该读一下手册
git rebase-h
告诉我,
--preserve merges
-p
选项尝试重新创建合并,而不是忽略它们。也许这也能解决你的问题?是的,
-p
就是解决方案。您在第一条评论中提出的建议非常令人不快,当您在不断变化的代码基上移动提交时,您会遇到比直接签出旧主控、插入新提交然后在其上继续交互式重基更糟糕或“奇怪”的合并冲突。这一点很好,如果您的功能分支中有大量提交,那么在它最终将要使用的地方进行补丁可以简单得多,并减少冲突。关于使用
-i
-preserve merges
(或
-p
),有一些一般性的建议,即:不要:-)新的
--rebase merges
模式可以正确处理此问题,但是
-p
(ab)使用交互机制进行隐含合并,重新排列拾取命令序列可能会导致交互代码进行错误合并。显然,如果它适用于您的特定测试用例,那么它不会触发问题,但是如果您使用
--rebase merges
,您将获得一个带有标签的交互式会话,标签将构建新的拓扑结构,因此您可以确保它在所有情况下都能工作。@torek感谢您提供的信息。我的Git一定太旧了,我看不到选项
——rebase merges
。对于OP的问题,使用交互式重定基来插入提交,而不使用重新排序。如果我正确理解您的评论,这意味着我的解决方案对于这个特定用例应该是安全的。我将编辑我的答案,建议对Git的最新版本使用
--rebase merges
。谢谢,这就是我想要的。我认为在这种情况下,
-p
选项是安全的,因为我实际上没有触及合并提交或之前的任何内容,我只需要一种交互式重新基址的替代方法,它能够在检查基本提交后立即停止。