在开发过程中,偶尔会遇到需要将两个独立的 Git 仓库合并,同时保留双方完整提交历史的情况。这通常发生在项目重构或代码整合阶段。下面分享一种稳妥的操作方案。
假设你有两个仓库 g1 和 g2,目标是将 g1 的文件移入 g2,且两边的日志都要保留。操作的核心思路是把 g1 当作远程仓库引入到 g2 中,抓取历史后合并分支。
先给目标仓库配置一个别名指向源仓库:
# 将 g1 作为远程仓库添加到 g2,别名为 other
git remote add other ../g1
接着从 g1 抓取数据。注意这里可能会提示没有共同提交(no common commits),这是正常现象,因为两个仓库的根提交不同:
# 从 g1 仓库中抓取数据到本仓库
git fetch other
抓取完成后,把 g1 的 master 分支作为一个新分支检出到本地,方便后续合并:
# 将抓取的 master 分支作为新分支 newbench
git checkout -b newbench other/master
然后切换回 g2 原本的 master 分支,准备进行合并操作:
# 切换回 g2 的 master 分支
git checkout master
最后执行合并命令。关键点在于加上 --allow-unrelated-histories 参数,否则 Git 会拒绝合并无共同祖先的分支:
# 将 newbench 合并入 master 分支
git merge newbench --allow-unrelated-histories
完成上述步骤后,若无冲突,查看日志即可看到双方的提交记录都已存在。如果遇到文件冲突,按常规流程解决后再提交即可。整个过程不需要重新初始化仓库,能最大程度保留原始信息。

