如何解决EGit Eclipse插件中的“多个合并基础”错误?

10

使用Eclipse EGit插件时,我遇到了“多个合并基础”异常。在此之前,我曾设法解决过类似情况,但这一次什么也没有帮助。

即使创建了额外的提交和分支、挑选 cherries,仓库分支似乎也被阻止合并。

这是异常信息:

An internal error occurred during: "Merging with refs/remotes/origin/master".
Exception caught during execution of merge command. java.io.IOException: Multiple merge bases for:
 082a3a9846147a0e6df72d6cffa6d6e517275b7b
 4d6c573c52ebb0de091bd91dbcefcbcbd44e7534 found:
 c480f2b3683a5d0c5607984ea6393d61dfa9fba4
 9da20a3c6304059ed92296ef2decb6f04e7112df
2个回答

12

EGit

自EGit 3.0起,递归合并策略是默认值(请参见bug 380314)。

如果您使用较旧的版本,请查看下载页面进行升级。

解决方法

或者,尝试将代码重置到最后一个本地提交之前,然后与origin/master合并。然后,如果您在原始合并之后进行了更多更改,请挑选这些更改。

另一种可能性是使用C git(在控制台上)进行合并,它可以处理这种情况。


5
如果您无法或不想更新到最新的EGit,那么最可靠的解决方法是(正如robinst建议的那样)从此状态中恢复,然后在命令行上合并。
请注意,正确恢复非常重要,因为多个合并基础问题会使您的存储库处于合并状态的中间状态。
如果您没有正确恢复,则下一个提交将导致合并提交,它悄悄地还原了所有远程更改!
换句话说,当您推送时,只有您的本地更改会出现在远程。所有远程更改都看起来像已经合并,但实际上已被忽略,就像在推送之前执行git merge -s ours一样。
您可以通过查找.git文件夹中的MERGE_HEADMERGE_MSG文件来检查是否处于合并状态。只需执行git status即可告诉您nothing to commit
$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 4 and 25 different commit(s) each, respectively.
#
nothing to commit (working directory clean)
$ cat .git/MERGE_HEAD 
1234567890abcdef1234567890abcdef12345678
$ cat .git/MERGE_MSG 
Merge remote branch 'origin/master'

你可以返回到尝试使用EGit合并之前的状态。
$ git reset --hard
HEAD is now at 0123456 Blah blah blah
$ cat .git/MERGE_HEAD .git/MERGE_MSG
cat: .git/MERGE_HEAD: No such file or directory
cat: .git/MERGE_MSG: No such file or directory

一如既往,这将失去自上次提交以来所做的任何更改。

  • 注意:这就是在执行拉取或合并之前提交所有更改的好处。
    • 如果拉取或合并失败,您的存储库处于不一致状态,您希望能够在再次尝试拉取/合并之前重置到已知的良好点。
  • 作为在拉取/合并之前提交的替代方案,您还可以隐藏您的更改,执行合并,然后取消隐藏它们。这实际上类似于未提交更改的迷你rebase,但具有预先合并提交的安全网。

请注意,您也可以执行git merge --abort,但在某些版本的git上,这会建议您提交更改,如果您想避免远程更改被静默还原(您绝对不想这样做),则不应该这样做。

现在,您可以使用git命令行重新运行最初想要的合并,它将使用递归解析策略,因此应该正常工作:

$ git merge origin/master
Auto-merging ...
...
Merge made by recursive.
...
$ git --no-pager log -1 --oneline
2345678 Merge remote branch 'origin/master'

我真希望我之前读了你的回答!我觉得我可能没有正确地恢复合并。你所说的“静默远程还原”是什么意思?我正在将主分支合并到开发分支,因为我想要同步它们,当我遇到多个基础时,我进入命令行以跳过推送。但是当我下次拉取开发分支时,似乎我丢失了对开发分支的最后一次提交。这个问题是否与静默远程还原一致? - Clarence Liu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接