如何合并两个同源但独立的Git仓库?
合并两个独立但高度相似的Git仓库
核心思路
因为两个仓库源自同一初始副本,我们需要先为它们建立共同的历史起点,之后就能像管理同一仓库的不同分支一样,轻松共享改动、合并变更。
具体步骤
1. 定位共同源头提交
找到B仓库当初从A复制时,A仓库对应的那个历史提交(记为A-base-commit)。如果记不清具体提交哈希,可通过对比两个仓库初始文件的快照,在A仓库中找到与B初始状态最匹配的提交。
2. 重定向B仓库的提交历史
把B仓库的所有提交,重新挂到A-base-commit下面,让两个仓库拥有共同祖先:
- 打开本地B仓库的终端,添加A仓库为远程源:
git remote add a-origin <A仓库的本地路径或远程URL> git fetch a-origin - 找到B仓库的第一个初始提交(记为
B-first-commit),执行变基:
这里git rebase --onto a-origin/main^ B-first-commit^a-origin/main是A仓库对应A-base-commit所在的分支,B-first-commit^表示从B的初始提交开始重定向历史。变基中遇到冲突时,手动解决后用git add .和git rebase --continue推进。
3. 合并到同一仓库统一管理
- 切换到本地A仓库的终端,添加处理后的B仓库为远程源:
git remote add processed-b <处理完成的B仓库本地路径> git fetch processed-b - 创建分支B来承载B仓库的历史:
git checkout -b branch-B processed-b/main - 现在
branch-A(原A分支)和branch-B有了共同祖先,后续操作就和普通分支一样:- 公共部分的改动,用
git cherry-pick把单个提交复制到另一个分支; - 改动不大的模块,直接执行
git merge branch-B(或反向),解决冲突即可完成合并。
- 公共部分的改动,用
备选方案(适合部分目录完全独立的场景)
如果两个仓库存在完全独立的目录,可考虑用git subtree或git submodule分别管理,但如果大部分文件重叠,优先用上述变基方案。
内容的提问来源于stack exchange,提问作者Sinus tentaclemonster
相关产品推荐
相关产品推荐

