2012-09-10 192 views
29

我试图帮助一位同事从另一个功能分支意外创建了一个功能分支,而不是从主设备创建第二个功能分支。这本质上是什么,我们现在有...将git分支分成两个分支?

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分支机构,cherry-选择各个提交到适当的V2分支。但我很好奇,有没有更好的方法来处理这种情况?

回答

12

它看起来对我来说,你可以:

git checkout J 
git rebase master 

编辑:

我试了一下我的建议,并没有工作。 knittl的建议不起作用(在我的盒子里)。这里就是我所做的工作:

git rebase --onto master foo bar 
+2

非常感谢;编辑过的版本效果很好! 如果有人需要更多的细节,可以参考Pro Git书中的“更有趣的Rebases”部分,它几乎涵盖了这个确切的例子:http://git-scm.com/book/en/Git-Branching-重新编制 –

+1

'git rebase --onto master foo bar'的意思是:不带“foo”的“bar”并将其放在主人身上 – schoetbi

57

对于更普遍的答案,这将帮助我们了解事情有点不仅仅是“运行此命令”更好,我们需要一个更大的示例。所以,让我们假设你在这种情况实际上是:

---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 - 这是告诉混帐使用此备用底垫语法标志
  3. newParent - 这是分行,你正在重新分配将有,因为它的父母
  4. oldParent - 这是您当前基础重建的分支有作为它的父
  5. branchToMove分支 - 这是您正在移动(重订)

关于“老上级分支”该位可分支有点令人困惑,但它真正在做的是说“忽略来自我的父母在进行rebase时发生的变化”。 oldParent是您如何定义您正在移动的分支(即branchToMove开始

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

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

注意,这些命令的顺序很重要,因为我们需要拉每个分支关闭最后的“支链”的。

+3

从最好的意义上说,把所有的魔力都带出来。只是用它来取消fubar(baz)一个功能分支,我在Foo上做了一些工作,然后有一些向Bar提交,然后是一些更多的Foo,但都在同一个提交行上。 #fail –

+1

优秀的答案。 –

+0

@cdeszaq我试图编辑但不知道发生了什么,在第一个图中有两个“酒吧”分支,当第一个应该是“Foo”以匹配其他答案和原始问题时。 – ryanwils