大 git 合并 - 跨提交拆分解决方案

Big git merge - split resolution across commits

假设我有一个 core-master 分支和一个 core-client1 分支,它们已经分裂了很久(> 2 个月)。

core-master 用于我们的主要产品,core-client1 用于客户的白标版本。直到现在我们无法合并,因为发布时间表。

现在可以了,我正在将 core-client1 更改合并回 core-master

我想将冲突解决方案“分解”为单独的提交,以便它们可以单独 reviewed/PR,并在需要时单独还原。

但是因为我还有冲突 - git 不会让我提交一些文件。

我意识到我可以将所有标记为已解决并开始返回它们 - 但随后我将不得不跟踪自己保存了哪些文件,并且历史记录将导致回购中存在许多提交的冲突提交状态。

我四处搜索了“git 部分合并提交”“git 拆分合并”,但只找到了有关从 core-master 中选择某些提交的信息,这与我的情况。

有正确的方法吗?

我将尝试描述我在类似情况下采用的策略:

有一段时间(几个月),我们有两个版本并存:

*--x--*--*--*--*--*--* <- master
    \
     A--B--C--D--E--F <- side-version  # the actual nr of commits was more like 100

一口气将 side-version 合并到 master 中是不可行的。

我最后做的是一点一点地合并:

# merging bit by bit :
*--x--*--*--*--*--*--* <- master
    \                 \
     \                 *-----*-----*--* <- fusion
      \               /     /     /  /
       --------------A--B--C--D--E--F <- side-version

为了便于使用:我没有直接在 master 上提交,我创建了一个 fusion 分支并在那里提交了合并。

关于 side-version 的历史,我列出了一些关键的提交(在我们的例子中:我使用了与已发布版本对应的提交),并开始合并这些版本,一次一个。

现在,由于两个版本都已上线,在某些情况下,side-version 上修复的错误也已在 master 上修复,因此有时“合并”会导致丢弃 side-version 并将版本保持在 master.

拥有孤立点主要让我能够:

  • 在减少的文件集上解决冲突,并使用范围内的更改日志,因此更容易验证每个步骤的行为(“master 上的行为,加上一些功能”而不是“两个版本结合")
  • 合并单元测试,并在我创建的每个新合并提交上验证它们
  • 在某些情况下,以当前合并状态启动服务器,并在我的开发机器上检查一些功能

“密钥提交”的选择实际上取决于您的设置:

  • 您可能只有少数提交 side-version,它们都描述了您的产品可运行和可测试的状态,在这种情况下,一个一个地合并提交是完全可以的,
  • 您可能有一些方法可以清楚地识别“这是添加此特定功能的位置”、“这是修复此错误的位置”,并使用这些,
  • 您可以选择任意将 side-version 的历史分成十块...

满足您的需求。


合并点的选择也可以调整:

  • 就我而言,荒谬的提交声明“8 月的 master 版本与 5 月的 side-version 版本”并不是一个障碍
  • 如果您有动力去实现更现实的合并,您还可以在 master 上确定“关键提交”:
# an alternative strategy :
*--x---P--Q--R--S--T--U--V <- master
    \      \     \        \
     \   *--*--*--*--*--*--* <- fusion
      \ /     /     /  /
       A--B--C--D--E--F <- side-version

合并确实花了一些时间(几天),在此期间 master 分支得到了发展。当我达到第一个令人满意的 fusion 状态时,我实际上不得不合并一些在 master.

上发布的额外功能和修复程序

在我们的例子中,有合并提交的历史是可以接受的;一旦达到 fusion 的满意状态,您可以选择重写它的历史,将提交拆分为一些更有意义的块...