如何将两个相似Git仓库合并到新仓库并保留提交历史?
解决Git合并同源仓库时的重命名冲突问题
针对你遇到的两个同源仓库合并时Git误判重命名导致大量冲突的问题,这里提供几个可行的解决方案:
方案一:合并时禁用重命名检测
这是最直接解决误判问题的方法,通过--no-renames参数完全关闭Git的重命名检测,让Git只根据文件路径判断差异,避免把Repo2下的文件误判为Repo1文件的重命名。
在MonoRepo仓库中执行:
git merge Repo2/main --allow-unrelated-histories --no-renames
因为你已经提前把两个仓库的内容分别移入Repo1/和Repo2/顶级目录,路径完全不重叠,关闭重命名检测后不会再出现rename/rename类冲突。
方案二:调整重命名检测阈值
如果你需要保留合法的重命名检测(比如仓库内确实有重命名操作),可以提高Git判定重命名的相似度阈值,减少误判概率:
- 先在MonoRepo中修改本地配置:
# 将重命名相似度阈值从默认50%提高到90%,只有高度相似的文件才会被判定为重命名 git config --local diff.renameThreshold 90 # 如果仓库文件数量多,调大重命名检测的文件上限(默认是1000) git config --local merge.renameLimit 10000
- 再执行合并操作:
git merge Repo2/main --allow-unrelated-histories
方案三:用git read-tree直接导入仓库内容
如果上述合并方式仍有问题,可以绕过Git的合并冲突检测,直接将两个仓库的内容分别导入到MonoRepo的对应目录,同时完整保留提交历史:
- 创建并初始化空的MonoRepo:
mkdir MonoRepo && cd MonoRepo git init
- 导入Repo1的内容到
Repo1/目录:
git remote add Repo1 ../Repo1 git fetch Repo1 # 将Repo1的main分支内容读取到Repo1/前缀下 git read-tree --prefix=Repo1/ -u Repo1/main git commit -m "Import Repo1 main branch into Repo1/"
- 导入Repo2的内容到
Repo2/目录:
git remote add Repo2 ../Repo2 git fetch Repo2 git read-tree --prefix=Repo2/ -u Repo2/main git commit -m "Import Repo2 main branch into Repo2/"
这种方式不会触发任何合并冲突,之后你可以逐步对比两个目录下的文件,进行代码去重和统一。
后续代码去重建议
合并完成后,你可以用以下方式处理重复代码:
- 用
git diff Repo1/ Repo2/对比两个目录的差异,定位需要合并的文件 - 使用IDE的文件对比工具批量处理相似文件的合并
- 对完全相同的文件,直接删除其中一份,保留统一版本并提交
内容的提问来源于stack exchange,提问作者user2690051
相关产品推荐
相关产品推荐

