2
头图

引言

在使用Git进行版本控制的过程中,你可能偶尔会遇到这样的错误信息:fatal: refusing to merge unrelated histories。这个看似棘手的问题实际上反映了 Git 的一种安全策略,旨在防止在没有共同历史的情况下合并两个独立的项目。本文将详细介绍这个问题产生的背景、原因,并提供几种有效的解决策略。

错误场景

1.在本地新建仓库和添加文件:

mkdir test-demo
cd test-demo
git init 
touch README.md
git add README.md
git commit -m "first commit"

2.通过 git remote add origin 指定远程仓库地址:

git remote add origin https://github.com/<user>/<repo_name>.git

3.提交代码后出现如下错误

λ git push origin master
To https://github.com/<user>/<repo_name>.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/<user>/<repo_name>.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. If you want to integrate the remote changes,
hint: use 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

4.由于无法提交,按照上面提示 git pull ... 进行操作:

λ git pull origin master
From https://github.com/<user>/<repo_name>
 * branch            master     -> FETCH_HEAD
fatal: refusing to merge unrelated histories

5.解决方法:使用 --allow-unrelated-histories 选项执行 git pull 命令。

# 更新
λ git pull origin master --allow-unrelated-histories
From https://github.com/<user>/<repo_name>
 * branch            master     -> FETCH_HEAD
Merge made by the 'ort' strategy.
 README.md | 38 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 38 insertions(+)
 create mode 100644 README.md
 
 # 提交
 λ git push origin master
Enumerating objects: 16, done.
Counting objects: 100% (16/16), done.
Delta compression using up to 8 threads
Compressing objects: 100% (13/13), done.
Writing objects: 100% (15/15), 8.43 KiB | 2.81 MiB/s, done.
Total 15 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/<user>/<repo_name>.git
   0f4b2a4..d66bff9  master -> master

问题解释

当Git检测到你尝试合并的两个分支没有共享的提交历史时,就会报出 fatal: refusing to merge unrelated histories 的错误。这意味着 Git 无法找到一个共同的祖先节点来执行常规的合并操作。这种情形常见于以下几种场景:

1. 克隆一个全新的仓库并试图与现有仓库合并:如果你从 GitHub 或其他地方克隆了一个全新的项目,并打算将其合并到正在工作的本地仓库中,Git 会识别到两者历史上的断层,从而拒绝合并。

2. 合并两个长期独立发展的项目:如果你有两个长期独立发展且未曾合并过的历史,试图将它们合并也会遇到此问题。

解决方法

这样的错误在执行 git pull, git push, git merge 命令可能会遇到,这是因为两个分支没有取得关系,具体的操作是在你操作命令后面加 --allow-unrelated-histories 参数就可以了。

# git merge

git merge master --allow-unrelated-histories

# git pull
git pull origin master --allow-unrelated-histories

# git push
git push origin master --allow-unrelated-histories

写在最后

fatal: refusing to merge unrelated histories 这个错误提醒我们在合并分支时应当谨慎行事,确保理解并尊重项目的历史演化路径。通过采取适当的解决策略,我们可以既保持 Git 仓库的清晰结构,又能满足项目整合的需求。在实践中,深入了解并灵活运用 Git 的各种命令和特性,将有助于我们更高效地管理和维护项目版本。

喜欢的话帮忙点个赞 + 关注吧,将持续更新 Git 相关的文章,还可以关注我的公众号 梁三石FE ,感谢您的关注~


梁三石
37 声望9 粉丝