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

时间:2012-08-31 23:03:10

标签: git eclipse-plugin merge egit

使用eclipse egit插件我遇到了“多个合并基础”异常。 在我成功解决问题之前,这次没有任何帮助。 即使在创建了额外的提交和分支之后,樱桃挑选。存储库分支似乎被阻止合并。

这是一个例外:

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 个答案:

答案 0 :(得分:13)

例如:It

这需要的递归合并策略是自EGit 3.0以来的默认值(见bug 380314)。

如果您使用的是旧版本,请参阅download page进行升级。

变通方法

或者,尝试在上次合并之前重置为上次本地提交,然后与origin/master合并。然后,如果你在原始合并之上做了更多更改,那就选择这些。

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

答案 1 :(得分:5)

如果您不能或不想更新到最新的EGit,那么最可靠的解决方法是(如robinst suggests)从此状态恢复,然后在命令行上合并。

  • 请注意,正确恢复是非常重要的,因为Multiple merge bases问题会使您的存储库处于合并状态中。
  • 如果您没有正确恢复,那么您执行的下一次提交将导致合并提交默默地还原所有远程更改!
    • 换句话说,当您按下时,只有您的本地更改将最终在遥控器上。所有远程更改看起来都已合并,但会被忽略,就像在执行推送之前执行git merge -s ours一样。

您可以通过查找MERGE_HEAD文件夹中的MERGE_MSG.git文件来查看您是否处于合并状态。只需执行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'