将git分支分成两个分支?

Mat*_* V. 40 git branch split

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

Master ---A---B---C
                   \
              Foo   E---F---F---H
                                 \
                            Bar   J---K---L---M
Run Code Online (Sandbox Code Playgroud)

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

Master ---A---B---C
                  |\
             Foo  | E---F---F---H
                  |
             Bar  J---K---L---M
Run Code Online (Sandbox Code Playgroud)

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

cde*_*zaq 88

对于一个更通用的答案,这将有助于我们比"运行此命令"更好地理解事物,我们需要一个更大的例子.所以,让我们假装你实际上处于这种情况:

---A---B---C <= Master
            \
             E---F---F---H <= Foo
                          \
                           J---K---L---M <= Bar
                                        \
                                         N---O---P---Q <= Baz
Run Code Online (Sandbox Code Playgroud)

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

---A---B---C <= Master
           |\
           | E---F---F---H <= Foo
           |\
           | J---K---L---M <= Bar
            \
             N---O---P---Q <= Baz
Run Code Online (Sandbox Code Playgroud)

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

git rebase --onto [newParent] [oldParent] [branchToMove]
Run Code Online (Sandbox Code Playgroud)

这意味着什么可以分解为几个部分:

  1. rebase- 改变某事的父母
  2. --onto - 这是告诉git使用这个备用rebase语法的标志
  3. newParent - 这是您正在变形的分支将拥有的分支作为其父级
  4. oldParent - 这是您正在变形的分支当前具有的分支,因为它是父分支
  5. branchToMove - 这是你要移动的分支(变基)

关于"旧的父母分支"的一点可能有点令人困惑,但它真正做的是它说"在做rebase时忽略我父母的变化".这oldParent是你如何定义你正在移动的分支(即branchToMove)开始的位置.

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

git rebase --onto Master Bar Baz
git rebase --onto Master Foo Bar
Run Code Online (Sandbox Code Playgroud)

请注意,这些命令的顺序很重要,因为我们需要将每个分支拉出"分支链" 的末尾.

  • 从最好的意义上说,从中获取所有的魔力.刚刚使用它来取消fubar(baz)一个功能分支,我在Foo上做了一些工作,然后一些提交到Bar,然后更多Foo,但都在同一个提交行.#失败 (4认同)
  • 很好的答案. (2认同)
  • @ryanwils感谢您提醒我错别字。我不知道为什么审稿人拒绝更改,但这绝对是错字。我已经修复了该图。 (2认同)
  • @Superole:IIRC,我做到了。因此也多次使用了“--onto”。 (2认同)

Don*_*son 14

它看起来像你可以:

git checkout J
git rebase master
Run Code Online (Sandbox Code Playgroud)

编辑:

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

git rebase --onto master foo bar
Run Code Online (Sandbox Code Playgroud)

  • `git rebase --onto master foo bar`意思是:不带"foo"取"bar"并将它放在master上 (5认同)
  • 非常感谢; 编辑后的版本效果很好!如果有人需要更多细节,Pro Git书中有一个"更有趣的Rebases"部分,几乎涵盖了这个确切的例子:http://git-scm.com/book/en/Git-Branching-Rebasing (3认同)

kni*_*ttl 6

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

git rebase --onto C H M
Run Code Online (Sandbox Code Playgroud)

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