技术 · 实用指南
Git 提示“refusing to merge unrelated histories”?先证明提交图,再决定是否放行
不要先加 --allow-unrelated-histories。先核仓库、远端、根提交和 merge-base;确认接错仓库就纠正身份,确实要保留两条独立历史才做有备份、可审阅的合并。

“fatal: refusing to merge unrelated histories”表示 Git 在要合并的两条历史之间没有找到共同祖先。它并不说明两者应该合并,也不证明远端正确或本地历史完整。
先保存现场并证明身份:核目录、远端、根提交与 merge-base。随后只做窄修复——纠正错误连接,或在确实要保留两个项目时执行可回退的合并。
改历史前先冻结证据
保存失败命令、仓库路径、git status --short --branch、git remote -v 和 git log --all --graph --decorate --oneline。reset、rebase 或 merge 前先做文件系统备份或保护分支。
确认必须保留的本地提交和未跟踪文件;若含密钥或来源不明的生成物,先停止并清理边界。
证明仓库身份和祖先关系
核对 remote URL,并 fetch 要比较的 refs。检查两端 tip 与根提交;错误目录、错误 origin、浅克隆或双初始化都会让图看起来异常。
运行 git merge-base A B 并检查退出状态与输出。有 base 时先查 refs 或 fetch 深度;没有 base 只支持“可能独立”,并不自动授权合并。
决定两条历史是否都应保留
若一边只是误建 README 或接错仓库,纠正 remote/path,或把目标文件移入干净 clone。确认树、提交 ID 与远端前不要删旧目录。
若两个项目的历史都必须可追溯,先写清最终目录、所有权和冲突规则;一方应落在子目录时考虑准备好的 subtree 流程。
有意识地执行例外合并
提交或 stash 预期改动,建保护分支并 fetch 准确 tip。只有证据表明两条根历史都应进入结果时,才使用 --allow-unrelated-histories。
逐项审冲突和完整 staged tree;路径异常碰撞或暴露不该合并的文件就 abort。flag 允许图操作,不负责验证结果。
验证结果并记录决定
检查 merge commit 的两个 parents,运行项目测试,并把最终树与预定布局比对;push 前再核远端目标和分支保护。
记录两个原 tip、merge-base 结果、备份位置、策略和保留原因。身份仍不清楚或出现意外多根时,应停下联系仓库 owner。
