Git合并两个master分支并保留独立目录与提交历史
解决方案:将两个独立分支合并到同一仓库的独立目录并保留提交历史
核心思路
问题出在你仅在分支末尾添加了文件移动的提交,Git仍会追踪历史中同一路径文件的修改,合并时会尝试合并内容导致冲突。正确做法是重写分支的全部提交历史,让两个分支的文件从一开始就处于不同目录,这样合并时Git会认为是完全独立的文件,不会产生冲突。
以下是具体步骤(基于Git 2.40.1,支持官方推荐的git filter-repo工具):
1. 先备份仓库
重写历史操作不可逆,务必先备份:
cp -r your-repo-directory your-repo-backup
2. 重写master_v1分支历史,将所有文件迁移到v1目录
git checkout master_v1 # 重写所有提交,将所有文件放入v1目录,完整保留提交历史 git filter-repo --to-subdirectory-filter v1
3. 重写master_v2分支历史,将所有文件迁移到v2目录
git checkout master_v2 # 同样重写历史,将所有文件放入v2目录 git filter-repo --to-subdirectory-filter v2
4. 创建合并分支并完成合并
# 获取两个分支的共同祖先提交ID COMMON_ANCESTOR=$(git merge-base master_v1 master_v2) # 从共同祖先创建新的合并分支 git checkout -b master_merge $COMMON_ANCESTOR # 合并处理后的master_v1(无冲突) git merge master_v1 # 合并处理后的master_v2(文件路径完全独立,无冲突) git merge master_v2
最终效果
合并完成后,仓库结构会完全符合你的预期:
v1 Api Controllers WeatherForecastController.cs V1Controller.cs Program.cs Api.csproj Api.sln v2 Api Controllers WeatherForecastController.cs V2Controller.cs Program.cs Api.csproj Api.sln
同时两个分支的所有提交历史都会完整保留。
注意事项
- 若仓库是共享的,重写历史后需要通知所有协作者重新克隆仓库,或使用
git push --force强制更新远程分支(操作前确认无未同步的他人修改)。 - 若系统未安装
git filter-repo,可通过包管理器安装(如brew install git-filter-repo),它是官方推荐替代老旧git filter-branch的工具,更高效可靠。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

