我在 git repo 中有 wordpress 主题,我对其进行了修改以满足我的需要。现在已经发布了主题的版本更新。我为主题更新创建了一个新分支并在那里提交了更新。现在我希望master
在合并时保留我对分支的更改。
但是怎么做?
当我将分支合并回master
with 时git merge theme
,它会覆盖我想要保留的更改!
那么我该怎么做呢?
如果您在提交对主题的更改theme
后分支到,它们已经在分支版本中(对于 git),因此将被覆盖。但你可以解决这个问题。首先,如果您已经合并,您的theme
分支进入master
,通过git log
(或使用 gitk)找到 master在您合并之前的提交theme
(git reflog
可能也知道这一点)。运行git reset --hard $commitid
,$commitid
你刚刚发现的提交的 id 在哪里。这是为了撤消(坏)合并。
然后,仍然在 master 上,您在对主题进行更改之前git log
通过并找到第一个提交。记下提交 ID,然后替换为您刚刚记下的 ID:COMMITID
git checkout COMMITID
Git 会说出一些关于分离的 HEAD 等的内容,但现在忽略它。现在你再次分支:
git checkout -b theme-new # equivalent to git branch theme-new
这将为您提供与 master 处于相同状态的分支COMMITID
。现在您再次下载新的主题版本并将其复制到存储库中。提交该更改。切换回主控:
git checkout master
验证 master 是否在您对其进行的最后一次提交上。然后做:
git merge theme-new
可能存在冲突,请参阅gitbook 中的此有用参考以了解如何管理它们。完成合并后,您应该拥有您想要的东西。
为什么会这样:在提交自定义主题后,您从 master 分支。这样,git 假设在新分支中已经包含了自定义主题。通过从上游复制更新的主题(并提交),你告诉 git 你想用下载的版本完全覆盖你的自定义版本。在合并时,git 会查找两个分支的最新共同提交(包括您的自定义),并且仅应用在该提交之后所做的任何提交。
因此,它将应用确切的提交,用上游版本覆盖整个主题。你显然不希望那样。通过执行我上面描述的操作,您将告诉 git,上游版本实际上是与您创建的版本“并行”创建的。所以它会更加小心,看看它如何合并更改。我会画一个漂亮的图表:
G---H theme
/
A---B---C---D master
\
E---F theme-new
假设提交A
并且B
是您在主题自定义之前对数据和任何开发的初始签入。进一步假设这C
是您自定义主题的提交,并且D
是其他内容。G
并且是您为从上游H
下载和应用包所做的提交,而实际上是相同的,只是在另一个分支中。theme
E
F
theme
merging和into master的区别theme-new
只是分支实际发散的地方master
,这很关键。如您所见,git 假设您的自定义包含在 中,因为您在自定义后theme
分支了。但是在 中,git 不会假设,因为您在更改之前将其分支。因此,它将尝试与自定义项进行实际合并。theme-new