You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 16:40:28