合并无共同祖先的历史
两个各自独立初始化的仓库合并时,会因「拒绝合并没有共同祖先的历史」而被拒。该选项显式放行这类合并,常用于把旧仓库的历史并入新仓库,或整合由不同系统导出的两套历史。
基本信息
| 用途 | 允许合并没有共同祖先的两个历史 |
|---|---|
| 语法 | git merge --allow-unrelated-histories <分支> |
| 默认行为 | 较新版本起默认拒绝此类合并 |
| 典型场景 | 旧仓库迁移、跨系统历史整合 |
| 替代方案 | 把提交接到新根上做变基,可保持单一线性历史 |
典型使用场景
- 把旧版本控制系统导出的历史并入新仓库
- 合并两个独立初始化但内容相关的仓库
- 历史归档仓库与在用仓库整合
- 迁移时保留完整提交记录以备审计
- 把独立开发的产品线并入统一主干
常用示例
常用示例
git remote add legacy /srv/git/legacy.git # 把旧仓库加为远端
git fetch legacy # 拉取旧仓库历史
git merge --allow-unrelated-histories legacy/master # 显式放行合并
git log --graph --oneline -20 # 查看合并后的历史走向
git status # 核对同名文件冲突现象与处理
| 现象 | 原因 | 处理 |
|---|---|---|
| 拒绝合并没有共同祖先的历史 | 两套历史没有共同起点 | 加上放行选项显式确认 |
| 同名文件冲突 | 两侧都存在说明文档等文件 | 逐文件确认保留哪一份 |
| 目录结构重叠 | 两个仓库布局相似 | 迁移前先规划目标目录布局 |
合并后两套历史在同一仓库中共存,历史图会出现两个起点;若需要单一线性历史,改成把提交接到新根上的变基更干净。
该选项只解决「允许合并」这一层,目录结构与文件命名冲突仍需人工规划,别指望一条命令搞定迁移。
迁移完成后建议在前几次提交里补充说明历史来源与目录约定,后来者看到两个历史起点时能立刻明白背景。