Git refusing to merge unrelated histories on rebase

Git refusing to merge unrelated histories on rebase

技术背景

在使用Git进行版本控制时,当尝试合并两个没有共同祖先的分支时,会出现 fatal: refusing to merge unrelated histories 错误。这是因为从Git 2.9版本开始,git merge 默认不允许合并没有共同基础的两个分支,以防止将不必要的并行历史合并到现有项目中。不过,Git提供了 --allow-unrelated-histories 选项来强制进行合并。

实现步骤

1. 解决 git pull 时的问题

当执行 git pull origin master 出现 fatal: refusing to merge unrelated histories 错误时,可以运行以下命令之一:

1
2
3
4
# 若分支为 master
git pull origin master --allow-unrelated-histories
# 若分支为 main
git pull origin main --allow-unrelated-histories

如果命令执行后打开了 nano 编辑器,可以使用 Ctrl + X 保存并关闭。之后使用 git push 将本地更改推送到远程仓库。

2. 解决 git rebase 时的问题

当执行 git rebase 出现错误时,例如:

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

可以手动进行合并。步骤如下:

  1. 找出原始合并提交的父提交:
1
2
3
4
5
6
7
$ git log -1 1234deadbeef1234deadbeef
commit 1234deadbeef1234deadbeef
Merge: 111111111 222222222
Author: Hans Dampf
Date: Wed Jun 6 18:04:35 2018 +0200

test merge commit
  1. 确定哪个合并父提交被合并到当前提交(通常是第二个,可使用 git log 222222222 验证),然后手动进行合并,并复制原始合并提交的提交消息:
1
2
3
4
5
6
7
$ 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.

3. 其他可能的解决方法

  • 强制推送
1
git push origin master --force

此方法可能会覆盖远程仓库,请谨慎使用。

  • 重置本地仓库
1
git reset --hard origin/master

适用于不需要本地更改,只想从远程获取最新内容的情况。

  • 重新克隆仓库

    1. 将本地仓库的文件复制到另一个文件夹,然后删除本地仓库文件夹。
    2. 重新克隆远程仓库。
    3. 将文件复制回新克隆的仓库并推送。
  • 樱桃选择合并提交

1
2
git cherry-pick -m 1 1234deadbeef1234deadbeef
git rebase --continue
  • 重新克隆并粘贴文件
    若在GitHub上创建新仓库时意外初始化了 README.gitignore 文件,或者 .git 文件夹损坏,可以创建一个新文件夹,使用 git clone 克隆仓库,然后将所有文件粘贴到该文件夹。

核心代码

强制合并 git pull

1
git pull origin branchname --allow-unrelated-histories

例如:

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

手动合并 git rebase

1
2
3
4
5
6
# 找出父提交
git log -1 1234deadbeef1234deadbeef
# 手动合并
git merge --allow-unrelated 222222222 --no-commit
git commit -C 1234deadbeef1234deadbeef
git rebase --continue

最佳实践

  • 在使用 --allow-unrelated-histories 之前,确保了解合并的影响,因为这可能会引入不必要的历史记录。
  • 合并后,仔细检查代码是否存在冲突,并解决所有冲突。
  • 定期更新本地仓库,避免因长时间未更新导致历史记录差异过大。

常见问题

合并后出现冲突怎么办?

使用合适的工具(如Android Studio)手动解决冲突,然后进行提交。

--allow-unrelated-histories 不生效怎么办?

可以尝试上述提到的其他解决方法,如重新克隆仓库、重置本地仓库等。

强制推送会有什么后果?

强制推送可能会覆盖远程仓库的历史记录,导致其他开发者的工作丢失。因此,在使用 git push --force 之前,务必与团队成员沟通。


Git refusing to merge unrelated histories on rebase
https://119291.xyz/posts/2025-05-09.git-refusing-to-merge-unrelated-histories-on-rebase/
作者
ww
发布于
2025年5月9日
许可协议