大 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
的满意状态,您可以选择重写它的历史,将提交拆分为一些更有意义的块...
假设我有一个 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
的满意状态,您可以选择重写它的历史,将提交拆分为一些更有意义的块...