【发布时间】:2010-09-20 22:12:02
【问题描述】:
如何在不痛苦的情况下逆转合并对极化分支的影响?
这个问题困扰了我几个月,我终于放弃了。
您有 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 个提交。
- 因此新鲜克隆需要半小时
- 如果存在甚至一个存储库的错误克隆某处,则它有可能重新与原始存储库联系,并将其全部破坏再次。
- 每个人都已经克隆了这个存储库,现在已经过去了几天,不断提交。
- 一个这样的克隆,恰好是一个实时站点,所以“擦除那个并从头开始”=“大诺诺”
(我承认,上面的许多内容有点愚蠢,但它们超出了我的控制范围)。
唯一可行的解决方案是假设人们可以并且将做错所有事情,并且有办法“撤消”这种错误。
【问题讨论】:
-
哎呀,看起来很难看...你也把这个发到selenic.com/mercurial/bts 吗?这听起来像是一个应该解决的 Hg 错误。
-
向所有人道歉,图片托管失败了:(我找不到原件
-
任何关于这个的消息只是出于兴趣,经过 2 年的开发,我想现在可能有更好的方法来处理这个问题? :)
-
可以理解为'A'分支是QA/Prod,'B'是Main/Dev吗?
标签: mercurial merge dvcs branch