所以我已经陷入困境。 我有一个主分支和主分支,另一个分支(称之为A)。
现在,我已经完成了A分支的工作,做了一个提交,但是后来我开始研究其他功能,而不是将它与master合并。在进行另一次提交之前,我做了git checkout -b B
然后将更改提交到新的B分支。现在我要做的是以某种方式从分支A中分离这些更改,将分支A与master合并,然后将这些更改重新附加到主分支(以从master开始的新分支的形式)。
我有办法做到吗?
答案 0 :(得分:4)
以下是解决此问题的一般方法。
首先,绘制分支图(你现在拥有的)。
...-o-o-o <-- master
\
a-a-a <-- branchA
\
b <-- branchB
其中o
是master
上的原始提交系列,a
是您在branchA
上提交的,b
是提交(或几个)你提交的branchB
。
然后,绘制你想要的东西。听起来你想要这个,其中M
是分支master
上的新合并提交,绑定branchA
上的提交:
b <-- branchB
/
...-o-o-o-------M <-- master
\ /
a-a-a <-- branchA
要实现这一点,您必须复制提交b
,因为一旦存在提交,就永远无法更改,b
&# 39; s parent是最后一次a
提交。因此,您要制作原始b
的副本。
我们确实需要调用副本b'
或其他内容,以区别于原始b
。让我们进入并在新b
上添加标记。这样我们就可以将旧b
留在图纸中了。如果我能得到颜色的东西,我可以用旧颜色绘制不同颜色的新提交 - 如果你在纸上或白板上这样做,在这里使用一些颜色或其他东西。
b' <-- new branchB
/
...-o-o-o-------M <-- master
\ /
a-a-a <-- branchA
\
b <-- old branchB, to be deleted when we're done
好的,现在让我们回到你现在所拥有的并进行比较。我们只需要两个新的提交,M
和b'
。
轻松制作M
。只是:
git checkout master
git merge branchA
如果一切顺利,你现在已经提交M
。 (如果您必须解决合并冲突,请执行此操作,然后提交,现在您已提交M
。)也就是说,我们现在已经达到了这一点:
...-o-o-o-------M <-- master
\ /
a-a-a <-- branchA
\
b <-- old branchB, to be deleted when we're done
现在我们要复制原始b
并获取要移动的分支标签。我们可以使用git cherry-pick
以及更多工作来完成这项工作,但是执行 的命令会移动标签。已完成,是git rebase
。我们想查看branchB
和&#34; rebase&#34;它到分支master
:
git checkout branchB
git rebase master
这将挑选branchB
而不是master
上的提交,即提交b
,复制它们(或者#34;它&#34;,in这个案例)到一个新的提交行(尖端)master
。这样就可以b'
,然后branchB
指向b'
。
如果一切顺利,你现在都完成了。 (在这种情况下它应该没问题。在更复杂的情况下,您可能必须执行相同类型的合并冲突解决,有时与git merge
有关 - 基础cherry-pick
s rebase是否都使用git merge
使用的相同合并代码,以便git可以在大多数时间自动执行正确的操作。)