Git在rebase时拒绝合并不相关的历史记录

3592

执行git rebase origin/development命令时,Git 显示以下错误信息:

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

我的Git版本是2.9.0。在以前的版本中它可以正常使用。

如何在新版本中使用强制标志,继续进行允许无关历史的变基操作?


19
恕我直言,最受欢迎的答案并没有直接回答这个问题。问题要求解决 git-rebase 的情况,而回答却给出了针对 git-merge 的标志。 - Shubham Chaudhary
9
如果有其他人犯了同样的错误,我在意外使用 git pull [repo URL] 而不是 git clone [repo URL] 后得到了这个错误。 - rsoren
5
可能是允许在git rebase中合并无关历史记录的重复问题。 - vossad01
77
由于标题没有指明这是在变基(rebase)的情况下,导致混乱。因此您的问题吸引了一些遇到不同情况下出现此错误的谷歌用户,并且他们给一个并不适用于你问的问题的答案点赞。现在很难进行清理,因此这个混乱的问题和答案将会一直存在于网站上并且在谷歌搜索结果中排名较高。故事的寓意是问题标题很重要! - Mark Amery
4
这个问题的最佳答案实际上可以在这个 Stack Overflow 的问题中找到。相比于这里的顶级答案,它更加安全、准确,并且解释得更好。 - Mike Williamson
显示剩余3条评论
33个回答

4097
您可以使用 --allow-unrelated-histories 强制执行合并操作。
这是因为自 Git 2.9 起,默认行为已更改:
“git merge”默认不允许合并两个没有共同基础的分支,因为这会创建一个全新的历史项目,并被一个毫无准备的维护者拉取,从而导致不必要的并行历史被合并到现有项目中。该命令已经被教导默认情况下不允许此操作,但提供了一个逃生口--allow-unrelated-histories选项,以在罕见事件中使用,即合并两个独立启动的项目的历史记录。
请参见Git发行说明获取更多信息。
在此答案中可找到更多信息

24
了解合并更改,但此选项与变基无法配合使用。 - Shubham Chaudhary
7
有没有选项可以永久打开 --allow-unrelated-histories - jmarceli
8
因为“两个项目合并”是一个稀有事件,没有添加一种配置选项来始终允许这样的合并。所以不行。 - blue112
35
非常好,它也适用于git pull。出现了“罕见事件,合并了两个独立启动的项目的历史记录”。git --work-tree="." pull --allow-unrelated-histories - Petru Zaharia
3
这个问题已经获得了2000多个赞,我不认为这是一个“罕见事件”。 - sffc
显示剩余9条评论

2010

在我的情况下,每次尝试合并代码时都会出现错误提示:fatal: refusing to merge unrelated histories,特别是在远程添加Git仓库后第一次提交拉取请求时。

使用--allow-unrelated-histories标志可以通过以下方式的拉取请求解决该问题:

git pull origin branchname --allow-unrelated-histories

根据2.9.0版本的发行说明 - git pull已经学会向底层的git merge传递--allow-unrelated-histories选项。


381
每次我创建一个带README.md的Github仓库并在第一次将其拉取到本地仓库时,总是会遇到这个错误。太烦人了。 - Tien Do
70
对于新的代码库和首次拉取,通常最好使用 git clone 开始。 - Umbrella
3
@PardeepJain,请查看此链接 https://github.com/git/git/blob/master/Documentation/RelNotes/2.9.0.txt#L58-L68 - Adil
4
这个问题困扰了我好几个小时,直到我意识到如果默认文件发生这种合并文件的情况,必定有一个明显的解决方法 - 我很高兴至少不是只有我遇到了这个问题! - Zibbobz
3
这是因为我在Github上添加了许可证文件。上面提到的命令(下面也一样)有效。 - uudaddy
显示剩余8条评论

738

尝试以下命令:

git pull origin master --allow-unrelated-histories

这应该能解决你的问题。


8
这个回答有什么比第一个回答好的地方吗?!https://dev59.com/ploU5IYBdhLWcg3wAjYs#37938036 应该作为评论或编辑提交到第一个回答上,以避免冗余和错误信息。 - cregox
8
好的,我会尽力进行翻译。以下是需要翻译的内容:cause it solves tl:dr因为它解决了“太长不看”。 - okandas
@okandas 祝你好运。浏览一些东西比大多数人愿意承认的需要更多的运气。 - cregox
这是正确的解决方案。 - ZamaaN
1
不应该被添加。 - WestCoastProjects

342

在我第一次建立本地代码仓库时,遇到了这个错误。之后我转到GitHub创建了一个新的代码仓库。然后我运行了下面的命令:

git remote add origin <repository url>

每次我尝试推送或拉取时,都会收到相同的fatal: unrelated_histories错误。

以下是我如何解决它的方法:

git pull origin master --allow-unrelated-histories
git merge origin origin/master
... add and commit here...
git push origin master

我认为我们处于同一艘船上。补充一点:我的问题是远程仓库已经存在某些内容。因此,在我的文件夹中,它删除了.git文件夹,运行了git init并执行了Adithya所说的操作,除了合并部分。 - codepleb
2
如何在Mac上按INSERT键?实际上,我必须从命令行中输入提交消息并执行合并,但我不知道如何从命令行中执行。 - Shajeel Afzal
它是否打开vim?如果是,只需按SHIFT + : - Adithya Bhat
2
这是一个非常好的答案。关键是你必须强制拉取然后合并本地和远程仓库。 - Alan
面对相同的情况并解决它: 首先,我在本地创建了一个项目并继续开发。后来,在Bitbucket中创建了一个项目和分支。我尝试了这种方法并解决了我的问题。谢谢@AdithyaBhat - Senthil Sivaramakrishnan

187

1. 解决问题

在执行git pull origin master时遇到错误后:

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

合并错误或其他 Git 操作错误

请记住,此错误可能发生在两个不同分支之间执行的其他操作中。 例如,当尝试合并两个没有相关历史记录的分支时,这是没有意义的。

无论如何,只需添加--allow-unrelated-histories就可以解决问题。

git merge some_branch --allow-unrelated-histories

2. 含义

  • 错误:

当两个不相关的项目合并时(即,这些项目彼此不知道对方的存在,并且提交历史不匹配),会出现“fatal: refusing to merge unrelated histories” Git错误。

默认情况下,git merge命令拒绝合并没有共同祖先的历史记录。当合并两个独立启动的项目的历史记录时,可以使用此选项来覆盖此安全性。由于这种情况非常罕见,因此不存在用于默认启用此选项的配置变量,并且不会添加。

Enter image description here


参考资料


更多关于Stack Overflow的内容


这是解决无关历史记录的最简单方法,完美地解决了! - Rohit Parte
应该标记为答案。 - Pratap Singh Mehra

170

为此,请输入以下命令:

git pull origin branchname --allow-unrelated-histories
例如,
git pull origin master --allow-unrelated-histories

参考资料:

GitHub不相关历史问题


谢谢您第一次拉取,它对我有用。"git pull origin master --allow-unrelated-histories" - Ankitkumar Makwana
这应该是一条评论或编辑,以避免冗余和错误信息。https://dev59.com/ploU5IYBdhLWcg3wAjYs#37938036 - cregox
git merge main --allow-unrelated-histories。我尝试将origin/main合并到live-origin/dev。 - MUHAMMAD SHAHID RAFI C P

132

我运行了这个命令,问题得到了解决。

git pull origin branchName --allow-unrelated-histories

查看此页面以获取更多信息。


12
git merge origin/main localBranchName --allow-unrelated-histories 对我有用。 - Kasir Barati

108

我有同样的问题。尝试这个:

git pull origin master --allow-unrelated-histories 

git push origin master

1
应该将这个内容作为评论或编辑,以避免冗余和错误信息。https://dev59.com/ploU5IYBdhLWcg3wAjYs#37938036 - cregox

56

对于Android Studio和IntelliJ:

首先,提交所有更改并解决任何冲突。

然后,在IDE下方打开终端并输入:

git pull origin master --allow-unrelated-histories

现在你可以推动了。


6
这是一个 Git 命令,与 Android Studio 或 Inteliji 无关。 - Alpit Anand
@AlpitAnand 是的,因为这个问题并不直接与Android Studio或IntelliJ有关,但我会写出在Android Studio处理此问题的方法。 - Amir Hossein Ghasemi

55

尝试运行 git pull --rebase development


这解决了我的问题。以下是问题的起因。 - Harlan Nelson
3
这句话的翻译是:“这可能应该是:git pull --rebase=preserve --allow-unrelated-histories development。”它建议使用此命令来拉取代码并保留原有分支历史,即使与当前分支没有关联的历史。 - Riccardo Murri
4
@RiccardoMurri,我刚尝试了一下,我不会再这样做了。我的新仓库里有一些初始化文件的示例,而本地仓库已经提交了好几个月了。使用newOrigin branch(而不是development)运行此命令后,初始提交被添加到了本地分支的顶部,有效地将几乎所有东西都删除了。我希望来自新远程仓库的初始提交位于本地分支底部。 - redOctober13

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