在git重新启动/开发过程中,git显示以下错误消息:

fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

我的Git版本是2.9.0。它在以前的版本中运行良好。

我如何才能继续使用新版本中引入的强制标志来允许不相关的历史?


当前回答

blue112的答案并不能解决这个问题,这是在重新定基的背景下。

同步两个分支的唯一方法是将它们合并在一起,从而产生一个额外的合并提交和两组包含相同更改的提交(原始提交和来自重新基础分支的提交)。不用说,这是一个非常令人困惑的情况。

因此,在运行git-rebase之前,请先问问自己,“还有人在看这个分支吗?”如果答案是肯定的,请把手从键盘上拿开,开始思考一种非破坏性的方法来进行更改(例如,git-restore命令)。否则,你可以随心所欲地重写历史。

参考资料:回扣的黄金法则

其他回答

由于所有其他答案实际上都没有回答这个问题,所以这里有一个由这个相关问题的答案启发的解决方案。

因此,您在执行git rebase时出错:

$ git rebase origin/development
fatal: refusing to merge unrelated histories
Error redoing merge 1234deadbeef1234deadbeef

此错误实际上并没有取消基,但您现在正处于其中:

$ git status
interactive rebase in progress; onto 4321beefdead
Last command done (1 command done):
   pick 1234deadbeef1234deadbeef test merge commit

现在您可以手动进行合并。查找原始合并提交的父提交:

$ git log -1 1234deadbeef1234deadbeef
commit 1234deadbeef1234deadbeef
Merge: 111111111 222222222
Author: Hans Dampf
Date:   Wed Jun 6 18:04:35 2018 +0200

    test merge commit

找出两个合并父级中的哪一个是合并到当前父级的父级(可能是第二个,请使用git日志222222222进行验证),然后手动进行合并,复制原始合并提交的提交消息:

$ git merge --allow-unrelated 222222222 --no-commit
Automatic merge went well; stopped before committing as requested
$ git commit -C 1234deadbeef1234deadbeef
[detached HEAD 909af09ec] test merge commit
 Date: Wed Jun 6 18:04:35 2018 +0200
$ git rebase --continue
Successfully rebased and updated refs/heads/test-branch.

git pull-origin main--允许不相关的历史记录

我在github没问题

我使用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从其他开发人员那里获得“更新”,这是在主分支上同时发生的。这样做可以减少拉取请求中可见的提交大小。因此,代码审阅者更容易看到我在这个特性分支中所做的更改。

在管理员在服务器端通过几百次提交将开发分支强制推送给origin/master之后,我遇到了这个错误。

嗯,我只是不想拉(fetch+merge),而是想将本地主机与远程源主机对齐。移动到一个单独的文件夹并进行Git克隆是一种方法,但我认为仅进行硬重置是更优雅的解决方案。

因此,我对这个错误的回答,在这个特定的例子中,不是上述任何一种。

我只是想要这个:

git reset --hard origin/master

在我的案例中,错误是致命的:每次尝试都拒绝合并不相关的历史记录,尤其是远程添加Git存储库后的第一次拉取请求。

使用--allow不相关的历史标记以这种方式处理拉取请求:

git pull origin branchname --allow-unrelated-histories

根据2.9.0发行说明,git pull已被教导将--allow unrelated history选项传递给基础git merge