我正在尝试帮助一个不小心从另一个功能分支创建一个功能分支的同事,而不是从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)
这意味着什么可以分解为几个部分:
rebase- 改变某事的父母--onto - 这是告诉git使用这个备用rebase语法的标志newParent - 这是您正在变形的分支将拥有的分支作为其父级oldParent - 这是您正在变形的分支当前具有的分支,因为它是父分支branchToMove - 这是你要移动的分支(变基)关于"旧的父母分支"的一点可能有点令人困惑,但它真正做的是它说"在做rebase时忽略我父母的变化".这oldParent是你如何定义你正在移动的分支(即branchToMove)开始的位置.
那么,在我们的情况下执行什么命令?
git rebase --onto Master Bar Baz
git rebase --onto Master Foo Bar
Run Code Online (Sandbox Code Playgroud)
请注意,这些命令的顺序很重要,因为我们需要将每个分支拉出"分支链" 的末尾.
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)
您可以将Bar分支重新绑定到master:
git rebase --onto C H M
Run Code Online (Sandbox Code Playgroud)
如果某些补丁发生冲突,您必须手动解决它们(但是在采摘樱桃时您也必须这样做).注意事项:当历史已经发布时,不要改变.