我有一个 repo,它有 2 个主分支 master_v1 和 master_v2(它们被部署为 2 个不同的服务)。
master_v2 是几年前从 master_v1 创建的,但从那以后两个分支都在继续开发。现在我受够了两次“修复”相同的东西,一次用于 v1,一次用于 v2,现在我想将它们合并到一个单独的分支中到单独的目录中,但仍保留提交历史记录,以便我们可以开始提取通用代码,只做一次。
不幸的是,我对 git 的基础知识还不够,我尝试的结果只会导致冲突。
一个简化的例子
master_v2创建前的master_v1文件结构:
Api
Controllers
WeatherForecastController.cs
Program.cs
Api.csproj
Api.sln
master_v2分支后的master_v1文件结构:
Api
Controllers
WeatherForecastController.cs
V1Controller.cs
Program.cs
Api.csproj
Api.sln
master_v2 文件结构:
Api
Controllers
WeatherForecastController.cs
V2Controller.cs
Program.cs
Api.csproj
Api.sln
所有“通用”文件也将在 master_v1 和 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
我试过的是这样的:
> mkdir v1
> git mv Api v1
> git mv Api.sln v1
> git commit -m "prepare for merge"
> mkdir v2
> git mv Api v2
> git mv Api.sln v2
> git commit -m "prepare for merge"
从这里我基本上迷路了。
如果我将 master_v1_for_merge 合并到 master_merge 中,我最终会得到预期的结果:
v1
Api
Controllers
WeatherForecastController.cs
V1Controller.cs
Program.cs
Api.csproj
Api.sln
但是如果我然后尝试将 master_v2_for_merge 合并到 master_merge 中,我会遇到冲突 例如 v1/Api/Api.csproj 和 v2/Api/Api.csproj 都有这个:
<<<<<<<< HEAD:v1/Api/Api.csproj
========
<PackageReference Include="Microsoft.ApplicationInsights" Version="2.21.0" />
>>>>>>>> master_v2_merge:v2/Api/Api.csproj
因为
PackageReference Include="Microsoft.ApplicationInsights" Version="2.21.0" />
只在master_v1分支中添加。
我不希望 v2 文件影响 v1 文件,反之亦然。
为此使用的正确 git 命令是什么?
我的git版本是2.40.1.
执行@knittl 的评论:
您可以为
git merge
提供选项以指示它不检测重命名:
git merge -s recursive -X no-renames master_v1_for_merge
看着
git help merge
,我找不到使用默认合并策略(-s ort
)的简单方法,也许有人可以提供更直接的方法来在合并期间禁用重命名检测。