如何在修补程序队列中使用mercurial合并功能,而不使用已弃用的qsave?

mr_*_*org 8 mercurial mercurial-queue

我有一个存储库,并使用mq补丁队列进行未完成的更改.补丁队列也受版本控制.

假设我有2个补丁p1和p2(按此顺序应用).现在我对p1进行了更改:

hg qnew p1
...
hg qnew p2
...
hg qref
hg com --mq -m"(Commit before reject)"
hg qpop p1
{make change}
hg qref
hg qpush -a
Run Code Online (Sandbox Code Playgroud)

......并且p2无法适用.

现在的标准方法是手动应用被拒绝的帅哥.我想使用像MqMergePatch这样的东西很好并使用mercurial的合并 - 但它基于不推荐使用的功能:

hg qsave // deprecated: use "hg rebase" instead
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何用hg rebase做到这一点?

编辑

在看过存储库的日志之后,我根本不喜欢MqMergePatch对它做的事情.我使用补丁程序的主要目标是使存储库的历史记录清晰,并且不会散布无用的细节.

Joe*_*ant 15

hg rebase我认为使用的建议具有误导性.该MqMergePatch页说,这是一个修改MqMerge,这是对的从其他地方拉新的变更上衍合一系列补丁的技术.

但是,它涉及保存已应用的补丁队列的副本(实际上是全部hg qsave does)并使用保存的副本作为影响补丁队列rebase的3向合并的参考的一部分.在我启用rebase扩展之前,我曾经自己这样做.然后,只需要在tip改变集之上重新设置第一个补丁,我想成为它的新父级.

这不是你想要的,因为你想要的是基本上修改你改变的补丁之上的补丁.但是,修补程序队列是线性的,只有在应用了修补程序集的变更集具有与修补程序队列平行的其他子项时,才能对该修补程序进行重新绑定:

--- A -------- patch1 --- patch2
     \
      \-- B
Run Code Online (Sandbox Code Playgroud)

在上述情况下,补丁队列可以重建基础上Bhg rebase很轻松地(因此使用建议hg rebase),但没有任何与您的情况.

解决您的情况

这是一个应用的补丁,其中包含未保存的本地更改,这些更改将与未应用的补丁冲突:

--- A --- patch1           <patch2>
             \
              \-- [changes]
Run Code Online (Sandbox Code Playgroud)

通常我会咬紧牙关并手动处理拒绝,因为它们通常很少.我发现如果我有一种手动处理太多拒绝的情况,我可能不会在一开始就正确地组织它们.

如果使用的技术qsaveqpush -m等,优选以下给你,这是不太可能的是qsave很快就会消失,任何时候,即使它已经过时了.

如果我真的想利用3向合并工具,我将如何处理上述情况:

(TortoisHg 2.x不允许我们修改补丁队列,所以这是我有时会完成的rebase-rebase的变种.)

现在patch2将干净利落地应用patch1new.