存储对分支所做的更改,合并分支,然后将更改应用于主分支

时间:2014-03-13 18:21:31

标签: git

所以我已经陷入困境。 我有一个主分支和主分支,另一个分支(称之为A)。

现在,我已经完成了A分支的工作,做了一个提交,但是后来我开始研究其他功能,而不是将它与master合并。在进行另一次提交之前,我做了git checkout -b B然后将更改提交到新的B分支。现在我要做的是以某种方式从分支A中分离这些更改,将分支A与master合并,然后将这些更改重新附加到主分支(以从master开始的新分支的形式)。

我有办法做到吗?

1 个答案:

答案 0 :(得分:4)

以下是解决此问题的一般方法。

首先,绘制分支图(你现在拥有的)。

...-o-o-o   <-- master
         \
          a-a-a   <-- branchA
               \
                b   <-- branchB

其中omaster上的原始提交系列,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

好的,现在让我们回到你现在所拥有的并进行比较。我们只需要两个新的提交,Mb'

轻松制作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可以在大多数时间自动执行正确的操作。)

相关问题