git 合并两个“主”分支,同时将它们保存在不同的目录中

问题描述 投票:0回答:1

我有一个 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

我试过的是这样的:

  1. 从 master_v1 创建分支 master_v1_for_merge(当前分支是 master_v1_for_merge):
> mkdir v1
> git mv Api v1
> git mv Api.sln v1
> git commit -m "prepare for merge"
  1. 从 master_v2 创建分支 master_v2_for_merge(当前分支是 master_v2_for_merge):
> mkdir v2
> git mv Api v2
> git mv Api.sln v2
> git commit -m "prepare for merge"
  1. 在 master_v2 被分支之前,从 master_v1 提交创建一个分支 master_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.

git git-merge git-rebase git-merge-conflict
1个回答
0
投票

执行@knittl 的评论:

您可以为

git merge
提供选项以指示它不检测重命名:

git merge -s recursive -X no-renames master_v1_for_merge

看着

git help merge
,我找不到使用默认合并策略(
-s ort
)的简单方法,也许有人可以提供更直接的方法来在合并期间禁用重命名检测。

© www.soinside.com 2019 - 2024. All rights reserved.