我在一个git仓库中有wordpress主题,我根据自己的需要进行了修改。现在已发布主题的版本更新。我为主题更新创建了一个新分支,并在那里提交了更新。现在我希望在合并时保留master
分支中的更改。
但是怎么样?
当我使用master
将分支合并回git merge theme
时,它会覆盖我想要保留的更改!
那我该怎么办呢?
答案 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
假设提交A
和B
是您在主题自定义之前的数据和任何开发的初始签到。进一步假设C
是您自定义主题的提交,D
是其他内容。 G
和H
是您在theme
中从上游下载和应用包时所做的提交,而E
和F
实际上是相同的,只是在另一个分支。
将theme
和theme-new
合并到母版之间的区别仅在于分支实际偏离master
的地方,这是至关重要的。正如您所看到的,git假定您的自定义 包含在theme
中,因为您在自定义后分支了。但是在theme-new
中,git不会假设,因为您在更改前将分支出来。因此,它将尝试与自定义实际合并。