如何将分支的部分提交变基到主分支?

3

起初,我有这样的东西:

      C---D (branch1)
     /
A---B (master)

因为我需要处理一些与branch1无关的其他事情,所以我决定创建一个新的分支(称为branch2)。我在branch2上进行了几次提交,然后推送了它们。

现在,我的意图是将master作为branch2的根。但是,我不小心做成了这样:

            E---F--G (branch2)
           /
      C---D (branch1)
     /
A---B (master)

有没有一种简洁的方法可以使分支branch2直接从master分支创建,如下所示?
    E---F--G (branch2)
    |       
    | C---D (branch1)
    |/
A---B (master)
1个回答

3

你的问题中的ASCII图形与描述在git-rebase手册页面中使用--onto标记的第二个示例非常相似:

Another example of --onto option is to rebase part of a branch. If we have the following situation:

            H---I---J topicB
           /
      E---F---G  topicA
     /
A---B---C---D  master

then the command

git rebase --onto master topicA topicB

would result in:

     H'--I'--J'  topicB
    /
    | E---F---G  topicA
    |/
A---B---C---D  master
那个例子说明通过运行,你能够达到期望的情况。
git rebase --onto master branch1 branch2
然而,您还写道,在您的存储库看起来像第二个ASCII图表时,您已经将branch2推送到某些远程位置。 您是否与其他人共享该远程位置? 如果是这种情况,请三思而后行,因为它是一种历史重写形式,并且
您永远不应该重写已经共享的历史记录。请注意,文本中保留了HTML标签。

1
太棒了!我甚至不知道git rebase onto,而我认为自己是Git rebase方面的专家。@Løiten请检查是否有人在你推送后拉取了branch2。如果没有,你可以使用git push origin branch2 --force强制将你的rebased分支推送到远程。 - Tim Biegeleisen
1
那是正确的答案。如果EFG中的更改与CD中的更改相关联,他可能需要解决冲突。 - chmike
@chmike,在这种情况下不应该出现冲突:git-rebase会在不需要用户干预的情况下知道该做什么,因为操作仅涉及在更早的祖先之上重播一堆提交。 - jub0bs
1
我在单个文件上测试了它并且出现了冲突。EFG中的更改(diffs)必须独立于CD。 - chmike
@chmike 这与我的直觉相违背,但我必须承认我还没有测试过。在测试之后我会再回复你的。 - jub0bs
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接