58

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

Master ---A---B---C
                   \
              Foo   E---F---F---H
                                 \
                            Bar   J---K---L---M

这就是我们想要的……</p>

Master ---A---B---C
                  |\
             Foo  | E---F---F---H
                  |
             Bar  J---K---L---M

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

4

3 回答 3

126

对于一个比“运行这个命令”更能帮助我们理解事物的更一般的答案,我们需要一个更大的例子。因此,让我们假设您实际上处于这种情况:

---A---B---C <= Master
            \
             E---F---F---H <= Foo
                          \
                           J---K---L---M <= Bar
                                        \
                                         N---O---P---Q <= Baz

这就是我们想要的……</p>

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

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

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

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

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

于 2014-05-19T18:18:54.763 回答
19

在我看来,您可以:

git checkout J
git rebase master

编辑:

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

git rebase --onto master foo bar
于 2012-09-10T16:38:22.160 回答
7

您可以将 Bar 分支重新设置为 master:

git rebase --onto C H M

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

于 2012-09-10T16:37:27.457 回答