你如何在不痛苦的情况下扭转合并对极化分支的影响?
这个问题困扰了我好几个月,终于放弃了。
您有 1 个存储库,有 2 个 命名分支。A和B。
发生在 A 上的变化将不可避免地发生在 B 上。
直接发生在 B 上的更改绝不能发生在 A 上。
在这样的配置中,将“B”合并到“A”中会在存储库中产生一个可怕的问题,因为对 B 的所有更改都出现在 A 中,就好像它们是在 A 中进行的一样。
从这种情况中恢复的唯一“正常”方法似乎是“退出”合并,即:
hg up -r A
hg backout -r BadMergeRev --parent BadMergerevBeforeOnA
看起来一切都很好而且花花公子,直到你决定稍后在正确的方向上合并,你最终会发生各种令人讨厌的事情,并且在专门的分支 B 上被删除/注释掉的代码突然变得未删除或未注释。
到目前为止,除了“让它做它的事情,然后手动解决所有问题”之外,还没有一个可行的解决方案,老实说,这有点令人难以置信。
这是澄清问题的图像:
[原图丢失]
文件 C & E (或更改 C & E ) 必须只出现在分支 b 上,而不能出现在分支 a 上。此处的修订版 A9(分支 a,revno 9)是问题的开始。
修订 A10 和 A11 是“回退合并”和“合并回退”阶段。
修订版 B12 是反复无常的,错误地反复删除了一个不打算删除的更改。
这种困境引起了很多挫折和蓝烟,我想结束它。
笔记
尝试禁止反向合并发生可能是显而易见的答案,无论是使用钩子还是使用策略,我发现解决这个问题的能力相当高,而且发生这种情况的可能性很大,即使有对策,你仍然必须假设它不可避免地会发生,以便您可以在它发生时解决它。
详细说明
在模型中,我使用了单独的文件。这些使问题听起来很简单。这些仅代表可能是单独的行的任意更改。
此外,雪上加霜的是,分支 A 发生了重大变化,这留下了长期存在的问题“分支 A 中的更改是否与分支 B 中刚刚出现(并退出)的变化相冲突,这看起来像是一个变化改为在分支 A 上“
关于历史重写技巧:
所有这些追溯解决方案的问题如下:
- 我们有 9000 个提交。
- 因此,新鲜克隆需要半小时
- 如果在某处甚至存在一个错误的存储库克隆,它就有可能重新与原始存储库联系,并再次将其撞毁。
- 每个人都已经克隆了这个存储库,现在已经过去了几天,正在进行提交。
- 一个这样的克隆恰好是一个实时站点,所以“擦除那个并从头开始”=“大诺诺”
(我承认,以上许多内容有点愚蠢,但它们不在我的控制范围内)。
唯一可行的解决方案是假设人们可以并且将会做错所有事情,并且有一种方法可以“消除”这种错误。