Git拒绝合并基础上无关的历史记录


2141

git rebase origin/developmentGit中显示以下错误消息期间:

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

我的Git版本是2.9.0。以前在以前的版本中可以正常工作。

如何使用新版本中引入的强制标志继续进行此基础更改,以允许不相关的历史记录?


12
@Shishya在所有应有的尊重下,投票最多的答案并不能直接解决此问题。问题询问git-rebase情况,而答案则给以下情况提供标志git-merge
Shubham Chaudhary

13
@AsifMohammed并不是要接受的答案。由于默认的投票排序方式,人们会自动找到投票最多的答案。
Glorfindel

2
如果有git pull [repo URL]git clone [repo URL]
人犯


35
标题未指定是在变基的情况下使这里变得一团糟,因此您的问题是吸引那些在不同情况下遇到此错误并质疑实际上没有答案的Google员工适用于您提出的问题。现在无法轻松清除它,因此不一致的问答对将保留在网站上,并永远在Google搜索结果中占据较高的位置。这个故事的寓意是问题标题很重要!
Mark Amery

Answers:


2611

自Git 2.9起,默认行为已更改:

默认情况下,“ git merge”用于允许合并没有共同基础的两个分支,从而导致创建现有项目的全新历史记录,然后由毫无戒心的维护者提取,从而允许将不必要的并行历史记录合并到现有项目中。该命令已被告知默认情况下不允许使用此命令,--allow-unrelated-histories在罕见的事件中使用了转义填充选项,该事件合并了两个独立启动项目的历史记录。

有关更多信息,请参见Git发行变更日志

您可以--allow-unrelated-histories用来强制合并发生。


18
知道合并更改,但此选项不能与重新设置一起使用
Shubham Chaudhary16年

3
有没有可以--allow-unrelated-histories永久开启的选项?
jmarceli

4
@jmarceli“由于这样的“两个项目合并”是罕见的事件,因此不会添加始终允许这样的合并的配置选项。” 所以不行。
blue112 '16

2
我试图以这种方式合并一个分支以使用另一个仓库,但是它在当前分支上创建了一个新的提交,并且没有保留其他仓库的历史记录。然后,我从另一个存储库中签出了一个本地分支,然后将其合并,突然出现了正常的合并提交。奇怪的。
mgol 2016年

13
git pull很好,也可以使用。发生在“罕见事件中,将两个独立开始生活的项目的历史融合在一起”。git --work-tree="." pull --allow-unrelated-histories
Petru Zaharia

1184

以我为例,fatal: refusing to merge unrelated histories每次尝试都会出现错误,尤其是在远程添加Git存储库后的第一个请求请求。

通过--allow-unrelated-histories这种方式将标志用于拉取请求:

git pull origin branchname --allow-unrelated-histories

231
如果我使用README.md创建新的Github存储库,然后在第一时间将其拉到本地存储库,则总是会看到此错误。很烦人。
天前

29
对于新的回购协议,请先从中拉取git clone


2
这让我停了好几个小时,直到我意识到必须有一个明显的解决方案来合并这样的文件(如果它出现在默认文件中)-我很高兴我不是唯一一个至少遇到此问题的人!
Zibbobz

3
就我而言,这是因为我在github上添加了许可证文件。上面提到的命令(下面是相同的)起作用了。
uudaddy

579

尝试以下命令:

git pull origin master --allow-unrelated-histories

这应该可以解决您的问题。


264

首先设置本地存储库时出现此错误。然后我去了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

1
如何在Mac上按INSERT按钮?实际上,我必须键入commit消息并从命令行进行合并,但是我不知道如何从命令行进行操作。
Shajeel Afzal”,

它会打开vim吗?如果是的话,那就只是SHIFT +:
Adithya Bhat

甚至我都首先创建了GitHub存储库,并正在执行添加存储库的命令。
Suryaa Jha先生

1
这是一个很好的答案。关键是您必须先强制​​拉然后合并本地和远程回购。
alanwsx


135
git pull origin <branch> --allow-unrelated-histories

您将被带到Vim编辑窗口:

  • 插入提交消息
  • 然后按Esc(退出“插入”模式),然后按:(冒号),再按x(小“ x”),最后Enter按退出Vim
  • git push --set-upstream origin <branch>

5
Ctrl + X不会让您离开Vim
Ruben

:x<Enter>将会
webKnjaZ


47

尝试 git pull --rebase development


这解决了我的问题。这里的问题是如何开始的
哈兰·纳尔逊

1
这可能应该是:git pull --rebase=preserve --allow-unrelated-histories development
Riccardo Murri,

3
@RiccardoMurri刚刚尝试过,我不会再这样做了。我的新存储库中包含一些示例初始化文件,而我的本地存储库数月值得提交。运行此命令(使用newOrigin branch而不是development)将初始提交添加到我的本地分支的顶部,从而有效地删除了其中的几乎所有内容。我希望新遥控器的初始提交位于底部。
redOctober13'9

41

对于Android Studio和IntelliJ:

首先,付出一切并解决任何冲突。

然后从IDE的下面打开终端并输入:

git pull origin master --allow-unrelated-histories

现在您可以推动了。


38

警告这可能会覆盖远程存储库

这为我工作:

git push origin master --force

1
但是本地和远程文件实际发生了什么?
Prathamesh更多

据我所知和经验,本地文件是完整的。您要添加到特定文件夹中的远程文件被添加。
Aniket Patil

5
不要这样!这将覆盖所有远程文件
Finomnis

只需加入免责声明,该命令将覆盖master分支中的所有文件。对我有好处。谢谢。
Flavio

1
它有效,但相当苛刻,--allow-unrelad-historys更具体,更适当
bdulac

32

由于所有其他答案均未真正回答该问题,因此以下是针对相关问题的此答案所启发的解决方案。

因此,您在执行操作时会出错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 log 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.

28

我有同样的问题。问题很遥远,有些东西阻止了这种情况。

我首先创建了一个本地存储库。我在本地添加了一个LICENSEand README.md文件并提交。

然后我想要一个远程存储库,所以我在GitHub上创建了一个。在这里,我检查“使用README初始化此存储库”时犯了一个错误,该错误也在远程创建了README.md。

所以现在当我跑步

git push --set-upstream origin master

我有:

error: failed to push some refs to 'https://github.com/lokeshub/myTODs.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes
(e.g. hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

现在克服这个我做了

git pull origin master

导致以下错误:

From https://github.com/lokeshub/myTODs
branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories**

我试过了:

git pull origin master --allow-unrelated-histories

结果:

From https://github.com/lokeshub/myTODs
 * branch            master     -> FETCH_HEAD
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed;
fix conflicts and then commit the result.

解:

我删除了远程存储库并创建了一个新文件(我认为只有删除文件才README可以使用),然后下面的方法起作用了:

git remote rm origin
git remote add origin https://github.com/lokeshub/myTODOs.git
git push --set-upstream origin master

25
创建新的存储库不是解决方案
Zach

3
git pull origin master --allow-
unrelated

git push --force ... 在这种情况下,将是第1步的适当解决方案
Konstantin Pelepelin

2
这不是解决方案。如果您是初学者,则可以这样做,但是如果您正在处理一些实际项目,则应该处理正确的方法。
Prathamesh更多,

27

当您第一次提交到远程存储库时,通常会发生这种情况。由于错误明确指出“拒绝合并无关的历史记录”,因此我们需要使用--allow-unrelated-histories标志。

git pull origin master  --allow-unrelated-histories

现在会有一些冲突,我们必须手动解决。之后,只需提交代码并推送即可。


正如问题中提到的,我正在尝试执行git-rebase而不是git-pull,git-rebase没有--allow-unrelated-histories标志。
Shubham Chaudhary

23

发生这种情况的两种可能性-

  1. 您已经克隆了一个项目,并且.git目录已被删除或损坏。这导致Git不了解您的本地历史记录,因此,当您尝试向远程存储库中拉入或拉出远程存储库时,它将导致它引发此错误。

  2. 您已经创建了一个新的存储库,并向其中添加了一些提交,现在您正尝试从已经具有自己的提交的远程存储库中提取信息。Git在这种情况下也会抛出错误,因为它不知道两个项目之间的关系。

git pull origin master --allow-unrelated-histories

参考-https: //www.educative.io/edpresso/the-fatal-refusing-to-merge-unrelated-histories-git-error


12

我也为此感到挣扎,但是我设法找到了解决方法。

当您遇到上述错误时,只需选择合并提交,然后继续进行重新设置即可:

git cherry-pick -m 1 1234deadbeef1234deadbeef
git rebase --continue

3
请用飞机英语吗?
特工斑马

@AgentZebra对于在复平面的任何盘连续闭合路径积分为0。
Addem

12

首先,使用以下命令将远程更改拉到本地:

git pull origin branchname --allow-unrelated-histories

**在我的情况下,branchname是master。

拉命令完成后,就会发生冲突。您应该解决冲突。我使用Android Studio解决冲突。 在此处输入图片说明

解决冲突后,合并完成!

现在您可以安全地进行推送了。


我一直在寻找Resolve ConflictAS中的按钮。有时右下弹出/气球消失,而我无能为力。感谢@oiyio
mochadwi


6

在执行时git pull,我收到fatal: refusing to merge unrelated histories 了一个关于repo模块的消息,其中有一段时间我没有更新本地副本。

我运行此命令只是为了从源刷新本地。我只是想从远程获取最新信息,而无需进行任何本地更改。

git reset --hard origin/master

就我而言,这已解决。


12
警告:这删除了我的所有文件。如果您不知道自己在做什么,请小心!
Salvi Pascual

2
这将删除所有未决的更改!
Orestis P.

1

我使用rebase已有多年,但从未遇到过这样的问题。但是,您的第一个问题是,您尝试直接在development名为的远程存储库的远程分支上执行此操作origin。从字面上看这是错误的,因为rebase是危险的命令,会重新构建git历史记录。话虽如此,您应该首先尝试在本地存储库上尝试并推送它(如果它可以按预期工作)。

因此,我通常的变基工作流如下所示(但请记住,您不应该在分支机构上使用变基,您不是唯一的一个委员会。对于这样的分支,请仅使用合并和解决冲突,如果适用):

  1. 确保您的工作树干净(没有未提交的更改)
  2. 签出您要作为基础的分支(例如,假设它是master;作为单行命令):git checkout master && git pull origin master && git checkout development
  3. 做实际的变基: git rebase master
  4. 如果完成,并且一切正常,请将其推送到您的遥控器。为此,您需要强制执行此操作,因为远程主机已经具有另一种顺序的历史记录,因此远程将不作任何回应。因此,我们需要说“我的历史记录的本地版本是正确的,请使用我的历史记录的本地版本覆盖该远程分支上的所有内容”:git push -f origin development

正如我已经提到的,请记住,rebase操作git历史记录,这通常是一件坏事。但是,也可以在没有其他人承诺的分支上执行此操作。为了使该分支对于其他开发人员而言是可拉式的,请使用其他合并策略,例如merge本身,squash或cherrypick。因此,换句话说:Rebase不应成为分布式开发的工具。如果您是唯一在此存储库上工作的人,那么它对您来说很好。

我们使用功能分支策略。在这种情况下,我通常使用rebase以便从其他开发人员那里获取“更新”,同时发生在master分支上。这样做可以减小在拉取请求中可见的提交的大小。因此,它使代码审阅者更容易看到我在此功能分支中所做的更改。


在这种情况下,我实际上想继续进行变基,但答案没有解决。我知道重新设置基准的风险以及何时应该不应该使用git-rebase。这是git工作流程的一般(建议)准则,不能直接回答问题。就使用rebase多年以来,此特定错误已添加到git v2.9.0中,并且该流程在该发行版之前可以正常工作。您在此答案中发布的内容已经在更老的问题中得到了解决,例如stackoverflow.com/a/11566503/2670370git-scm.com/book/en/v2/Git-Branching-Rebasing
Shubham Chaudhary

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.