将功能分支重新定位到另一个分支的特定提交

时间:2016-05-14 13:13:35

标签: git git-rebase

我正在尝试将功能分支(从主分支)重新绑定到另一个分支的特定提交。 我的初始状态如下

       C -- D            branch1
      /     
A -- B -- E -- F         master
                \
                         branch2 (zero commits after creating the branch)

我首先将branch2重新绑定到主服务器中的A上,但工作正常。我目前的状态(根据我的理解)应该是以下

       C -- D             branch1
      /
A -- B -- E -- F          master
 \
  B -- E -- F             branch2

我验证了branch2在提交A处从master分支出来,甚至与主分支有关。我现在想要的是这个

A -- B -- E -- F          master
 \
  B -- E -- F             branch2
   \
    C -- D                branch1

我试过

git checkout branch1
git rebase --onto B branch2

但这导致了一大堆冲突,我根本不明白这些冲突是如何产生的。也许我完全误解了rebase的作用?

注意:在将branch1成功重新绑定到branch2的B之后,我打算将master重置为A,因此最终版本应该看起来如下。

A                  master
 \
  B -- E -- F      branch2
   \
    C -- D         branch1

1 个答案:

答案 0 :(得分:3)

您的假设存在一些问题。首先,分支只是提交的指针。您从这开始,master已签出。

       C -- D      branch1
      /     
A -- B -- E -- F   master

git branch branch2之后你有了这个。

       C -- D      branch1
      /     
A -- B -- E -- F   master & branch2

注意没有存根分支,masterbranch2都指向F.除了他们的名字,它们是无法区分的。

结帐时branch2git rebase A没有任何变化。 branch2在其祖先中已经有A,它仍然指向F。您应该收到Current branch branch2 is up to date之类的消息。

当你git checkout branch1git rebase --onto B branch2这个混乱的事情发生时。假设第三个参数,即当前检出的分支。你实际运行的是git rebase --onto B branch2 branch1。这表示“接受branch1可以访问的提交但不能通过分支2(与git log branch2..branch1或C和D相同)并将它们放到B”上。这应该是一个no-op,但是如果branch1和branch2有任何共同的变化,rebase会将它们抛出。

如果C和E做出相同的改变,你最终可能会遇到这种情况,并且可能是冲突。

       C -- D      original branch1
      /     
A -- B -- E -- F   master & branch2
      \
       D1 branch1

这没有多大意义,但是当你试图在两个表兄弟之间进行变基时会发生这种情况。

另请注意,重新分支的分支具有ID D1,而不是D.提交ID包含其父代的ID,因此ID必须更改。 rebase不会重写历史记录,它会创建新的历史记录并告诉您它是如何一直存在的。一个微妙但重要的区别。你的原始提交仍然存在......一段时间。

如果你想离开这个:

       C -- D      branch1
      /     
A -- B -- E -- F   master & branch2

对此。

A                  master
 \
  B -- E -- F      branch2
   \
    C -- D         branch1

这可以翻转,以便与你拥有的更好地对齐。

       C -- D      branch1
      /     
     B -- E -- F   branch2
    /
   A               master

您需要做的就是将master移至A.有几种方法可以做到这一点,其中一种方法是git branch -f master A。这会强制master移至A