8

我有一个存储库,并且正在使用 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

...并且 p2 无法申请。

现在的标准方法是手动应用被拒绝的帅哥。我想使用类似MqMergePatch的东西,它很好并且使用了 mercurial 的合并——但它基于已弃用的功能:

hg qsave // deprecated: use "hg rebase" instead

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

编辑

在查看了存储库的日志之后,我完全不喜欢 MqMergePatch 对它所做的事情。我使用补丁的主要目标是清理存储库的历史记录,而不是散布无用的细节。

4

2 回答 2

15

我认为使用的建议hg rebase具有误导性。MqMergePatch页面说它是对 MqMerge 的修改,是一种在从其他地方提取的新变更集之上重新定位一系列补丁的技术。

但是,它涉及保存已应用的补丁队列的副本(实际上就是全部hg qsave does),并将保存的副本用作影响补丁队列变基的 3 路合并参考的一部分。在启用 rebase 扩展之前,我曾经自己这样做过。然后,只需在我想成为它的新父级的提示变更集之上重新构建第一个补丁即可。

但这不是您想要的,因为您想要的基本上是在您更改的补丁之上重新定位补丁。但是,补丁队列是线性的,如果应用了补丁的变更集有其他与补丁队列平行的子节点,则只能对补丁进行变基:

--- A -------- patch1 --- patch2
     \
      \-- B

在上述情况下,可以很容易地重新基于补丁队列Bhg rebase因此​​建议使用hg rebase),但这与您的情况无关。

针对您的情况的方法

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

--- A --- patch1           <patch2>
             \
              \-- [changes]

通常我会硬着头皮手动处理拒绝,因为它们通常很少。我发现如果我遇到太多拒绝手动处理的情况,我可能一开始就没有正确组织它们。

如果使用qsaveandqpush -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 patch2atopC以便使用 3 路合并来解决本地 patch2其他 C使用base B之间的冲突:

    (我必须在 TortoiseHg 2.x 中通过在patch2变基之前完成,然后将其导入回队列中来做到这一点。)

    --- A --- B --- C --- patch2
    
  • 再次作为补丁导入BC进入队列:

    --- A --- patch1 --- patch1b --- patch2
    
  • 弹出patch2然后patch1b折叠patch1bpatch1(重命名为patch1new):

    --- A --- patch1new       <patch2>
    

现在patch2将干净地应用于patch1new.

于 2011-08-05T03:41:04.680 回答
1

我最近一直在做一个扩展来做这件事,因为我一直在使用很多 MQ 补丁。扩展名被调用qsmooth(因为你“平滑”了你的补丁)。

你可以在这里看看:https ://bitbucket.org/jwdevel/qsmooth

它使用的程序与Joel 的回答中的程序非常相似。我还没有在生产中大量使用它,但它有相当多的测试,我很高兴收到错误报告。

于 2015-06-29T04:16:39.397 回答