交换分支合并 git

Swap branch merges in git

我想在合并时交换 git 存储库中两个分支的角色。由于有很多潜在的方法可以解决我的问题,我将只解释我的情况以避免 X-Y 问题:

我正在为经过多次硬件修订的设备开发固件,这需要固件中存在细微差异(主要是不同的常量)。 (相关的)硬件修订为 "proto2"、"proto3" 和 "proto4"。原始主分支称为 "master",当前对应于硬件修订版 "proto2"。在 "proto3" 出现的那些日子里,我创建了一个新的分支(想象中) "proto3"。然后,我对 "proto3" 分支进行了与新硬件修订相关的更改,并在 "master" 中继续开发修订 "proto2"。这样我就可以检出 "proto3",将 "master" 合并到其中,并让我的 "proto3" 兼容固件具有新功能。从那时起,"proto4" 出现了,它又发生了变化(字面意思是一行)。所以现在我在 "master" 中开发,然后必须始终合并对 "proto3" 和 "proto4" 的更改(这也意味着我必须在旧原型上进行开发)。

现在我们开始生产,"proto4" 将成为生产固件。然而,由于一些较旧的原型仍然非常有用,我想实际上交换分支的角色,即能够在分支 "proto4" 中开发并从那里合并到 "master" 而无需将之前对 "proto4" 所做的硬件相关更改引入 "master"。

换句话说,除了某些(旧的)提交不会从 "proto4" 合并到 "master"。

我可以想到几种方法来实现这一点:

  1. 我总是可以简单地将 "proto4" 中的新提交挑选到 "master" 中。但是,每次我向后移植更改时我都需要记住这样做,忘记它会导致一团糟。
  2. 我可以将 "proto4" 合并到 "master",然后在 "master" 中还原 "proto4" 的硬件相关提交,即撤消更改。我将需要挖掘提交日志以找到这些更改,但它应该是可行的。

选项 2. 似乎是解决此问题的一种并非不合理的方法,因为这是一次性的麻烦,而且只有一次出错的机会。但是,我觉得应该有一种更简单的方法,我不必手动选择正确的提交来还原?

P.S.: 我当然也会重命名分支,但这似乎被 Switch branch names in git, and maybe even better by https://mohitgoyal.co/2018/04/07/swap-master-branch-with-another-branch-in-git/

涵盖了

请问您是否可以拥有以下内容:

  • 以master为通用代码,
  • 每个硬件都有一个 proto# 分支,满足他们的特定需求,所有这些都基于 master
  • 当 master 发生变化时,要么将 proto 分支重新设置在它之上(这意味着强制推送和开发人员之间的良好沟通),要么在每个分支中合并 master(将使日志不那么干净,并使其更难一眼就能看出 proto 分支的具体内容)
  • 也许将生产原型分支命名为 production-proto# 以快速知道哪个是生产分支

所以每个硬件都可以有自己的代码,master只是通用部分。

当你想创建一个新硬件时,你从master创建一个新分支。

当你想停止硬件时,只需删除它的分支即可。

我想出了一个办法:

首先,获取"proto4"和"master"当前头的差异:

git diff proto4..master > diff.txt

然后将"proto4"合并到"master",即现在的"master"就是以前的"proto4"。第一步完成,包括重命名。然后创建一个新分支 "proto2",并结帐 "proto2"。现在应用之前创建的差异:

git apply diff.txt

并提交更改,并附上适当的消息,即 "recreated proto2 firmware" 等

最后,作为清理步骤,您可以删除现在不需要的 "proto4" 分支(您可以仔细检查 diff master proto4 是否为空)。