将git分支分成两个分支?
我试图帮助一位同事从另一个功能分支意外创建了一个功能分支,而不是从主设备创建第二个功能分支。这本质上是什么,我们现在有...将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分支。但我很好奇,有没有更好的方法来处理这种情况?
它看起来对我来说,你可以:
git checkout J
git rebase master
编辑:
我试了一下我的建议,并没有工作。 knittl的建议不起作用(在我的盒子里)。这里就是我所做的工作:
git rebase --onto master foo bar
对于更普遍的答案,这将帮助我们了解事情有点不仅仅是“运行此命令”更好,我们需要一个更大的示例。所以,让我们假设你在这种情况实际上是:
---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]
这意味着可以细分为多个部分:
-
rebase
- 更改的一些家长 -
--onto
- 这是告诉混帐使用此备用底垫语法标志 -
newParent
- 这是分行,你正在重新分配将有,因为它的父母 -
oldParent
- 这是您当前基础重建的分支有作为它的父 -
branchToMove
分支 - 这是您正在移动(重订)
关于“老上级分支”该位可分支有点令人困惑,但它真正在做的是说“忽略来自我的父母在进行rebase时发生的变化”。 oldParent
是您如何定义您正在移动的分支(即branchToMove
)开始。
那么,在我们的情况下执行什么命令?
git rebase --onto Master Bar Baz
git rebase --onto Master Foo Bar
注意,这些命令的顺序很重要,因为我们需要拉每个分支关闭最后的“支链”的。
从最好的意义上说,把所有的魔力都带出来。只是用它来取消fubar(baz)一个功能分支,我在Foo上做了一些工作,然后有一些向Bar提交,然后是一些更多的Foo,但都在同一个提交行上。 #fail –
优秀的答案。 –
@cdeszaq我试图编辑但不知道发生了什么,在第一个图中有两个“酒吧”分支,当第一个应该是“Foo”以匹配其他答案和原始问题时。 – ryanwils
非常感谢;编辑过的版本效果很好! 如果有人需要更多的细节,可以参考Pro Git书中的“更有趣的Rebases”部分,它几乎涵盖了这个确切的例子:http://git-scm.com/book/en/Git-Branching-重新编制 –
'git rebase --onto master foo bar'的意思是:不带“foo”的“bar”并将其放在主人身上 – schoetbi