尝试从我的GitHub仓库拉取文件: "refusing to merge unrelated histories"。 拒绝合并不相关的历史记录。

155

我正在学习Git,并遵循Git社区书籍的指导。

很久以前,我在Github上创建了一个公共存储库,其中包含一些文件。现在我在当前计算机上设置了本地Git存储库,并提交了一些文件。接着我添加了一个指向我的Github页面的远程仓库:

[root@osboxes c]# git remote add learnc https://github.com/michaelklachko/Learning-C

那似乎是成功的:

[root@osboxes c]# git remote show learnc
* remote learnc
  Fetch URL: https://github.com/michaelklachko/Learning-C
  Push  URL: https://github.com/michaelklachko/Learning-C
  HEAD branch: master
  Remote branch:
    master tracked
  Local ref configured for 'git push':
    master pushes to master (local out of date)

现在我想从我的 Github 存储库下载文件到我的电脑。我已经这样做了:

[root@osboxes c]# git fetch learnc
[root@osboxes c]# git merge learnc/master
warning: refname 'learnc/master' is ambiguous.
Already up-to-date.

然而,我在本地目录中没有看到任何新文件。我该如何获取它们?

我还尝试过这样做:

[root@osboxes c]# git pull learnc master
From https://github.com/michaelklachko/Learning-C
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories

顺便说一下,我本地在主分支上(没有其他分支):

[root@osboxes c]# git status
On branch master
nothing to commit, working directory clean

4
在设置本地仓库时,您是克隆了您的Github仓库还是只进行了git init操作?如果是后者,则这些仓库是无关的(没有共同的提交),因此您不能合并它们(pull操作是fetch和merge的组合)。 - Paul
我执行了git init。那么我应该克隆我的Github存储库来解决这个问题吗? - MichaelSB
1
你可以克隆你的Github存储库并继续使用它,但它仍将是单独的存储库。你想要合并两个不相关的历史记录吗? - Paul
太好了,运行成功了。但是现在我想用本地文件更新我的Github存储库。我这样做了:`[root@osboxes c]# git push learnc fatal: The current branch master has no upstream branch. To push the current branch and set the remote as upstream, usegit push --set-upstream learnc master`这是什么意思? - MichaelSB
3
https://dev59.com/jF4c5IYBdhLWcg3wssBs#36528527 - max630
显示剩余2条评论
8个回答

321

1
根据GitHub发布说明中的注释。 - systemaddict
为什么没有一个配置选项可以始终设置这个?每次我都必须寻找这个选项;我从2008年开始使用git,对这种繁琐的操作感到非常恼火。这个愚蠢的选项并不总是存在。至少拒绝消息应该包括使用覆盖的选项。 - nyov

103
git checkout master
git merge origin/master --allow-unrelated-histories

解决冲突,然后

git add -A .
git commit -m "Upload"
git push

1
感谢您详细说明上述解决方案。 - Rahul Raj

42
尽管我支持解决人们的工作问题,但我不认为“push --force”或“--allow_unrelated_histories”应该作为常规解决方案教给新用户,因为如果不理解为什么事情一开始不起作用而使用它们,可能会对存储库造成真正的破坏。
当您遇到这种情况时,在本地存储库中开始并希望在GitHub上创建一个远程存储库以共享您的工作时,有一些需要注意的事项。
创建新的在线存储库时,有一个选项“使用README文件初始化此存储库”。如果你仔细阅读,它说“如果你正在导入现有存储库,请跳过此步骤。”
您可能已经勾选了该框。或者类似地,在尝试初始推送之前进行在线添加/提交。发生的情况是您在每个位置上创建了唯一的提交历史记录,并且它们无法通过特殊允许(因为git不希望您以这种方式操作)来协调。您可以遵循这里提到的建议,或者更简单地下次连接一些本地文件到全新的远程时不要勾选该选项;让远程干净以备初始推送。
参考资料:我与git + hub的第一次经历就是遇到了同样的问题并进行了很多学习以了解发生了什么以及为什么。

13

在你的分支上 - 比如主分支,执行拉取并允许无关历史

git pull origin master --allow-unrelated-histories

对我很有效。


1
这个命令是你需要的,同意在Github创建一个原始repo时添加许可证或ReadMe。 - F1Linux

12
如果在一个端点上没有实质性的历史记录(也就是说,如果GitHub上只有单个readme提交),我通常发现手动将readme复制到我的本地repo并执行git push -f更容易使我的版本成为新的根提交。
我发现这样稍微不那么复杂,不需要记住一个模糊的标志,并且可以使历史记录保持更加清晰。

4
执行以下命令:
git pull origin master --allow-unrelated-histories

将会打开一个合并Vim。 添加一些合并信息并执行以下操作:

  1. 按ESC键
  2. 按Shift + ';'键
  3. 按'w'键然后按'q'键。

这样你就可以继续了。


4

当我使用--allow-unrelated-histories时,这个命令生成了太多的冲突。有一些文件发生了冲突,但我并没有在上面工作过。为了解决错误" Refusing to merge unrelated histories",我使用了以下的rebase命令:

git pull --rebase=preserve --allow-unrelated-histories

在此提交后,使用提交信息提交未提交的更改。最后,运行以下命令:

git rebase --continue

操作完成后,我的工作副本已与远程副本同步,可以像之前一样推送我的更改。在拉取时不再出现无关历史记录错误。


1
实际版本:git pull --rebase=merge --allow-unrelated-histories,因为--rebase=preserve已被弃用。https://git-scm.com/docs/git-pull#Documentation/git-pull.txt---rebasefalsetruemergespreserveinteractive - Luckylooke

0
在我的情况下,我遇到了同样的问题,特别是在远程添加Git存储库后尝试第一次拉取请求时。出现了以下错误。
fatal: refusing to merge unrelated histories on every try

使用 --allow-unrelated-histories 命令。它可以完美地工作。

git pull origin branchname --allow-unrelated-histories

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