我认为使用的建议hg rebase
具有误导性。MqMergePatch页面说它是对 MqMerge 的修改,这是一种在从其他地方提取的新变更集之上重新定位一系列补丁的技术。
但是,它涉及保存已应用的补丁队列的副本(实际上就是全部hg qsave does
),并将保存的副本用作影响补丁队列变基的 3 路合并参考的一部分。在启用 rebase 扩展之前,我曾经自己这样做过。然后,只需在我想成为它的新父级的提示变更集之上重新构建第一个补丁即可。
但这不是您想要的,因为您想要的基本上是在您更改的补丁之上重新定位补丁。但是,补丁队列是线性的,如果应用了补丁的变更集有其他与补丁队列平行的子节点,则只能对补丁进行变基:
--- A -------- patch1 --- patch2
\
\-- B
在上述情况下,可以很容易地重新基于补丁队列B
(hg rebase
因此建议使用hg rebase
),但这与您的情况无关。
针对您的情况的方法
这是一个已应用的补丁,其中未保存的本地更改将与未应用的补丁冲突:
--- A --- patch1 <patch2>
\
\-- [changes]
通常我会硬着头皮手动处理拒绝,因为它们通常很少。我发现如果我遇到太多拒绝手动处理的情况,我可能一开始就没有正确组织它们。
如果使用qsave
andqpush -m
等的技术对你来说比下面的更可取,那么即使它已被弃用,它也不太可能很快qsave
被删除。
如果我真的想利用 3 路合并工具,我将如何处理上述情况:
(TortoisHg 2.x 还不允许我们对补丁队列进行 rebase,所以这是我有时会做的 finish-rebase-import 的变体。)
而不是qrefresh
,用于qnew
使未保存的更改成为新补丁:
--- A --- patch1 --- patch1b <patch2>
将这些补丁完成为常规变更集:
--- A --- B --- C <patch2>
patch
更新将干净应用的变更集( B
),并应用补丁:
--- A --- B --- patch2
\
\-- C
Rebase patch2
atopC
以便使用 3 路合并来解决本地 patch2
和其他 C
使用base B
之间的冲突:
(我必须在 TortoiseHg 2.x 中通过在patch2
变基之前完成,然后将其导入回队列中来做到这一点。)
--- A --- B --- C --- patch2
再次作为补丁导入B
并C
进入队列:
--- A --- patch1 --- patch1b --- patch2
弹出patch2
然后patch1b
折叠patch1b
成patch1
(重命名为patch1new
):
--- A --- patch1new <patch2>
现在patch2
将干净地应用于patch1new
.