我正在尝试将功能分支(从主分支)重新绑定到另一个分支的特定提交。 我的初始状态如下
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
答案 0 :(得分:3)
您的假设存在一些问题。首先,分支只是提交的指针。您从这开始,master
已签出。
C -- D branch1
/
A -- B -- E -- F master
git branch branch2
之后你有了这个。
C -- D branch1
/
A -- B -- E -- F master & branch2
注意没有存根分支,master
和branch2
都指向F.除了他们的名字,它们是无法区分的。
结帐时branch2
和git rebase A
没有任何变化。 branch2
在其祖先中已经有A
,它仍然指向F
。您应该收到Current branch branch2 is up to date
之类的消息。
当你git checkout branch1
和git 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
。