【问题标题】:How to split a git branch into two branches?如何将一个git分支分成两个分支?
【发布时间】:2012-09-03 13:38:38
【问题描述】:

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

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 分支中。但我很好奇,有没有更好的方法来处理这种情况?

【问题讨论】:

    标签: git split branch


    【解决方案1】:

    对于一个比“运行此命令”更能帮助我们更好地理解事物的更一般的答案,我们需要一个更大的示例。所以,让我们假设你真的处于这种情况:

    ---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 - 改变 something 的父母
    2. --onto - 这是告诉 git 使用这种备用变基语法的标志
    3. newParent - 这是您正在变基的分支将拥有的分支,因为它是父分支
    4. oldParent - 这是您正在变基的分支当前作为其父级的分支
    5. branchToMove - 这是你要移动的分支(变基)

    关于“旧父分支”的部分可能有点令人困惑,但它实际上是在说“在进行变基时忽略我旧父分支的更改”。 oldParent 是您定义要移动的分支的方式(即branchToMove开始

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

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

    请注意,这些命令的顺序很重要,因为我们需要从“分支链”的末端中拉出每个分支。

    【讨论】:

    • 尽最大可能发挥它的所有魔力。只是用它来取消 fubar(baz) 一个功能分支,我在 Foo 上做了一些工作,然后对 Bar 进行了一些提交,然后是更多的 Foo,但都在同一个提交行上。 #失败
    • @BenMosher:我意识到这是很久以前的事了,但是您在使用这种方法将 foo-bar-foo 变成干净的 foo 和 bar 方面真的成功还是失败了?
    • @Superole:IIRC,我做到了。因此也多次使用--onto。 ??
    【解决方案2】:

    在我看来你可以:

    git checkout J
    git rebase master
    

    编辑:

    我尝试了我的建议,但它不起作用。 knittl 的建议不起作用(在我的盒子上)。以下是对我有用的方法:

    git rebase --onto master foo bar
    

    【讨论】:

    • 非常感谢;编辑后的版本效果很好!如果有人需要更多关于这方面的细节,Pro Git 书中有一个“更有趣的变基”部分几乎涵盖了这个确切的例子:git-scm.com/book/en/Git-Branching-Rebasing
    • git rebase --onto master foo bar 意思是:把没有“foo”的“bar”放到master上
    【解决方案3】:

    你可以将你的 Bar 分支变基到 master:

    git rebase --onto C H M
    

    如果某些补丁发生冲突,您必须手动解决它们(但在采摘樱桃时也必须这样做)。警告:当历史已经发布时不要变基。

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 2013-11-09
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 2013-04-03
      • 2010-12-15
      • 1970-01-01
      相关资源
      最近更新 更多