1

我在 git repo 中有 wordpress 主题,我对其进行了修改以满足我的需要。现在已经发布了主题的版本更新。我为主题更新创建了一个新分支并在那里提交了更新。现在我希望master在合并时保留我对分支的更改。

但是怎么做?

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

那么我该怎么做呢?

4

1 回答 1

1

如果您在提交对主题的更改theme 分支到,它们已经在分支版本中(对于 git),因此将被覆盖。但你可以解决这个问题。首先,如果您已经合并,您的theme分支进入master,通过git log(或使用 gitk)找到 master您合并之前的提交themegit 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下载和应用包所做的提交,而实际上是相同的,只是在另一个分支中。themeEF

thememerging和into master的区别theme-new只是分支实际发散的地方master,这很关键。如您所见,git 假设您的自定义包含在 中,因为您在自定义theme分支了。但是在 中,git 不会假设,因为您在更改之前将其分支。因此,它将尝试与自定义项进行实际合并。theme-new

于 2012-12-12T19:46:15.950 回答