在git重新启动/开发过程中,git显示以下错误消息:
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef
我的Git版本是2.9.0。它在以前的版本中运行良好。
我如何才能继续使用新版本中引入的强制标志来允许不相关的历史?
在git重新启动/开发过程中,git显示以下错误消息:
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef
我的Git版本是2.9.0。它在以前的版本中运行良好。
我如何才能继续使用新版本中引入的强制标志来允许不相关的历史?
当前回答
我认为这是一种非常罕见的情况;您已删除远程(例如,原点):
git remote rm origin
然后,过了一段时间,出于某种原因,您尝试将其添加回去,但输入了错误的URL。
git remote add origin git@github.com:example/wrong.git
当然,解决方案是使用正确的URL:
git remote add origin git@github.com:example/correct.git
其他回答
致命的:拒绝合并不相关的历史也可能是由于肤浅的克隆造成的,因为嫁接提交没有深入到足以看到共同的基础。
首先,使用以下命令将远程更改拉到本地:
git pull origin branchname --allow-unrelated-histories
**在我的情况下,branchname是master。
当执行pull命令时,会发生冲突。你应该解决冲突。我使用Android Studio解决冲突。
当冲突解决后,合并就完成了!
现在你可以安全地推了。
1.解决问题
执行git pull原始主机时出现以下错误:
fatal: refusing to merge unrelated histories
运行以下命令之一
# It could be master
git pull origin master --allow-unrelated-histories
# Or main
git pull origin main --allow-unrelated-histories
# Or just try with origin
git pull origin main --allow-unrelated-histories
如果它打开nano编辑器,您只需按Ctrl+X保存并关闭即可。
现在在本地推送更改
git push
2.含义
错误:
当两个不相关的项目(即,不知道彼此存在且提交历史不匹配的项目)合并时,会出现“致命:拒绝合并不相关的历史”Git错误。
getmerge命令(来自GitHub文档):--允许不相关的历史记录:--允许不相关的历史记录
默认情况下,gitmerge命令拒绝合并不共享共同祖先的历史记录。当合并两个独立启动的项目的历史记录时,可以使用此选项覆盖此安全性。由于这是非常罕见的情况,因此默认情况下没有启用此功能的配置变量,也不会添加。
工具书类
推荐:“致命:拒绝合并不相关的历史”Git错误Git 2.9发行说明
有关堆栈溢出的更多信息
推荐使用--允许不相关的历史记录的一个很好的解释和警告:在拉到恢复的存储库时“拒绝合并不相关的记录”失败如果--允许不相关的历史记录不起作用:添加Git远程后“致命:拒绝合并不相关历史记录”Git拒绝合并不相关的历史。什么是“无关历史”?该用户使用GitHub桌面:如何解决在将项目上传到GitHub时“拒绝合并不相关的历史记录”的问题?Git失败,出现致命错误,拒绝将无关历史与Git推送合并
我使用rebase多年了,从未遇到过这样的问题。然而,您的第一个问题是,您试图从远程存储库(称为origin)直接在远程分支开发上执行此操作。这实际上是错误的,因为rebase是一个危险的命令,它会重新构建git历史。话虽如此,但您应该首先尝试本地存储库,并仅在符合预期的情况下推送它。
因此,我通常的rebase工作流如下所示(但请记住,您不应在分支机构上使用rebase,因为您不是唯一的一个委员会。对于此类分支机构,如果适用,请使用简单的合并和解决冲突):
确保您有一个干净的工作树(没有取消提交的更改)签出到您要重新基于的分支(例如,假设它是master;作为单行命令):gitcheckout-master&&gitpull-origin-master&&gitcheckout-development执行实际的rebase:git rebase-master如果已经完成,并且一切都按预期运行,请将其推到远程。为此,您需要强制它,因为远程主机已经按另一顺序拥有历史记录,所以远程主机将无需推送任何内容。所以,我们需要说“我的本地版本的历史是正确的,使用我的本地历史版本覆盖远程分支上的所有内容”:git push-f origin开发
正如我已经提到的,记住,rebase操纵git历史,这通常是一件坏事。然而,在分支上也可以做到这一点,因为其他人都不承诺这样做。为了让其他开发人员能够使用分支,可以使用另一种合并策略,如合并本身、squash或cherrypick。因此,换句话说:Rebase不应该成为分布式开发的工具。如果您是唯一在这个存储库上工作的人,那么它很适合您。
我们使用特征分支策略。在这种情况下,我通常使用rebase从其他开发人员那里获得“更新”,这是在主分支上同时发生的。这样做可以减少拉取请求中可见的提交大小。因此,代码审阅者更容易看到我在这个特性分支中所做的更改。
您可以使用--允许不相关的历史记录强制合并。
这背后的原因是自Git 2.9以来,默认行为发生了变化:
“gitmerge”用于合并两个没有公共项的分支默认情况下,这导致了现有项目被创建,然后被一个不知情的维护人员拉住,这允许将不必要的并行历史合并到现有项目。命令已被教导不允许这样做默认情况下,带有转义线--允许不相关的历史记录选项用于合并两个项目历史的罕见事件独立开始他们的生活。
有关更多信息,请参阅Git发布变更日志。
更多信息可以在这个答案中找到。