将git分支分成两个分支?

时间:2012-09-10 16:35:40

标签: git split branch

我正在尝试帮助一位不小心从另一个功能分支创建一个功能分支的同事,而不是从主人创建第二个功能分支。这基本上就是我们现在所拥有的......

Master ---A---B---C
                   \
              Foo   E---F---F---H
                                 \
                            Bar   J---K---L---M

这就是我们想要的......

Master ---A---B---C
                  |\
             Foo  | E---F---F---H
                  |
             Bar  J---K---L---M

我想到的一种方法是创建FooV2和BarV2分支,然后将各个提交选择到适当的V2分支中。但我很好奇,有没有更好的方法来处理这种情况?

3 个答案:

答案 0 :(得分:71)

对于一个更通用的答案,这将有助于我们理解事情,而不仅仅是运行这个命令",我们需要一个更大的例子。所以,让我们假装你真的处于这种情况:

---A---B---C <= Master
            \
             E---F---F---H <= Foo
                          \
                           J---K---L---M <= Bar
                                        \
                                         N---O---P---Q <= Baz

这就是我们想拥有的......

---A---B---C <= Master
           |\
           | E---F---F---H <= Foo
           |\
           | J---K---L---M <= Bar
            \
             N---O---P---Q <= Baz

值得庆幸的是,Git在rebase命令的选项中为我们提供了解决方案!

git rebase --onto [newParent] [oldParent] [branchToMove]

这意味着什么可以分解成部分:

  1. rebase - 更改某事的父母
  2. --onto - 这是告诉git使用此备用rebase语法的标志
  3. newParent - 这是您正在改变的分支将拥有的分支作为其父母
  4. oldParent - 这是您正在变形的分支当前拥有的分支作为其父母
  5. branchToMove - 这是您正在移动的分支(变基)
  6. 关于&#34;旧的父母分支&#34;可能会有点令人困惑,但它真正做的是它说&#34;忽略我做旧的父母做的变化时的变化&#34;。 oldParent是您定义要移动的分支(即branchToMove的起始位置的方式。

    那么,在我们的情况下要执行的命令是什么?

    git rebase --onto Master Bar Baz
    git rebase --onto Master Foo Bar
    

    请注意,这些命令的顺序很重要,因为我们需要从&#34;分支链&#34;的 end 中拉出每个分支。

答案 1 :(得分:13)

我认为你可以:

git checkout J
git rebase master

编辑:

我尝试了我的建议并且它不起作用。 knittl的建议不起作用(在我的盒子上)。这对我有用:

git rebase --onto master foo bar

答案 2 :(得分:6)

您可以将Bar分支重新绑定到master:

git rebase --onto C H M

如果某些补丁发生冲突,您必须手动解决它们(但是在挑选樱桃时也必须这样做)。注意事项:当历史已经发表时,不要改变。