如何在保留master中的更改的同时进行Git Merge?

时间:2012-12-12 18:34:15

标签: git merge git-merge

我在一个git仓库中有wordpress主题,我根据自己的需要进行了修改。现在已发布主题的版本更新。我为主题更新创建了一个新分支,并在那里提交了更新。现在我希望在合并时保留master分支中的更改。

但是怎么样?

当我使用master将分支合并回git merge theme时,它会覆盖我想要保留的更改!

那我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

如果你在后分支到theme ,你提交了对主题的更改,那么它们已经处于分支版本(对于git),因此将被覆盖。但你可以解决这个问题。首先,如果您已经将theme分支合并到master,请通过git log(或使用gitk)查找之前主人的提交你在theme合并(git reflog也可能知道这一点)。运行git reset --hard $commitid,其中$commitid是您刚发现的提交的ID。这是撤消(坏)合并。

然后,仍然在master上,您通过git log并在之前找到第一个提交,您对主题进行了更改。记下提交ID并执行操作,将COMMITID替换为您刚才记下的ID:

git checkout COMMITID

Git会说出关于分离的HEAD等等的东西,但是现在忽略它。现在你再次分支:

git checkout -b theme-new  # equivalent to git branch theme-new

这将为您提供与主人在COMMITID处于同一状态的分支。现在,您再次下载新主题版本并将其复制到存储库中。承诺改变。切换回主人:

git checkout master

验证master是否在您对其进行的最后一次提交中。然后做:

git merge theme-new

可能存在冲突,请参阅this helpful reference in the gitbook以了解如何管理冲突。完成合并后,您应该拥有您想要的内容。


为什么会这样:在之后,您已经提交了自定义主题,从而分支了主。通过这种方式,git假设在 new 分支中,已经包含了自定义主题。通过从上游中复制更新的主题(并提交),您告诉git您希望使用下载的版本完全覆盖您的自定义版本。在合并时,git会查找两个分支具有的最新常见提交(包括您的自定义),并且只应用之后之后的任何提交。

因此它将应用使用上游版本覆盖整个主题的确切提交。你好不好意思。通过执行上面描述的操作,您将告诉git upstream 版本实际上是与您创建的版本“并行”创建的。所以它会更加小心,看看它如何合并变化。我将绘制一个很好的图表:

              G---H theme
             /
A---B---C---D       master
     \
      E---F         theme-new

假设提交AB是您在主题自定义之前的数据和任何开发的初始签到。进一步假设C是您自定义主题的提交,D是其他内容。 GH是您在theme中从上游下载和应用包时所做的提交,而EF实际上是相同的,只是在另一个分支。

themetheme-new合并到母版之间的区别仅在于分支实际偏离master的地方,这是至关重要的。正如您所看到的,git假定您的自定义 包含在theme中,因为您在自定义后分支了。但是在theme-new中,git不会假设,因为您在更改前将分支出来。因此,它将尝试与自定义实际合并。