如何合并两个独立的 Git 仓库(保留双方历史)

合并两个仓库并保留历史:把源仓库加为远程,git fetch 后用 git merge --allow-unrelated-histories 合并其分支。想把源仓库放进子目录,用 git subtree add 或先 filter-repo 重写路径再合并。

最佳实践
Git 提交历史与版本恢复示意

核心思路:把 B 仓库加为 A 仓库的远程,fetch 后用 --allow-unrelated-histories 合并——两段历史都会保留,仓库出现两个根提交。若想把 B 的内容放进 A 的某个子目录,用 git subtree add 一步到位。

基础合并(历史并列)

cd repo-a
git remote add repo-b git@github.com:org/repo-b.git
git fetch repo-b

git merge repo-b/main --allow-unrelated-histories
# 解决文件冲突后提交

git remote remove repo-b    # 收尾:移除临时远程

合并后 git log --graph 会看到两条独立起源的线在某个合并点汇合。

合并到子目录(monorepo 整合)

git subtree add --prefix=vendor/repo-b repo-b main
# repo-b 的全部内容+历史进入 vendor/repo-b/ 目录

subtree 方式让文件落在指定子目录,避免与 A 的根目录文件互相覆盖,是"多仓库合成 monorepo"的常用手段。

大规模整合建议

  • 先想清楚目录规划:哪些项目进哪个子目录;
  • 每个仓库单独 subtree add,一次一个,冲突逐个解决;
  • 合并后用 git filter-repo 整理(如统一作者邮箱、清理大文件);
  • tag 名冲突(两个仓库都有 v1.0.0)需提前重命名。

常见问题(FAQ)

Q:合并后两仓库还能各自独立更新吗?

能但麻烦: subtree 支持 git subtree pull 继续同步源仓库更新。长期看选定一个仓库为准,另一个归档只读。

Q:GitHub 上两仓库的 Issues/PR 会合并吗?

不会,那是平台数据。只迁移 Git 历史;Issues 需要用平台 API 或导入工具另行处理。

Q:合并后仓库很大很乱怎么收拾?

filter-repo 可以重写路径、按目录拆分、清理历史大文件。整合 monorepo 通常要配套一次彻底的历史治理。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台