Mercurial Queues 教程对于这个用例来说太糟糕了。我看到的所有示例都假设您尚未提交并且正在刷新单个补丁。大多数时候情况并非如此,您有 2 或 3 个提交要压缩在一起或以其他方式更改。
假设你有这样的历史:
---O---O---A---B---C
第一个示例是压缩提交 A、B 和 C。首先 init mq:
$ hg qinit
现在我们需要将提交 A、B 和 C “导入”到补丁队列中。让我们假设它们是最后 3 次提交。我们可以使用“-N”修订语法来导入它们,如下所示:
$ hg qimport -r -3:-1
这意味着作为补丁从 3 个补丁导入到最后一次提交。您可以使用hg qseries 检查这些补丁的状态。它应该显示如下内容:
$ hg qseries
101.diff
102.diff
103.diff
其中数字 101、102 和 103 对应于提交 A、B 和 C 的本地修订号。现在这些补丁已应用,这意味着它们描述的更改已经在工作副本。您可以使用hg qpop 摆脱工作副本的更改并将它们从提交历史中删除,仅以补丁形式保存它们。您可以说hg qpop; hg qpop 将更改C 和B 从堆栈中弹出,或者指定一个补丁来“弹出”。在这种情况下,它会是这样的:
$ hg qpop 101.diff
now at: 101.diff
您现在在补丁队列中拥有提交 B 和 C 的补丁,但它们并未应用(它们的更改已“丢失” - 它们仅存在于补丁队列区域中)。现在您可以将这些补丁合并到最后一个中,即我们创建一个新的提交,相当于更改 A+B+C 的总和。
$ hg qfold -e 102.diff 103.diff
这将显示您的编辑器,以便您更改提交消息。默认情况下,消息将是更改 A、B 和 C 的提交消息的串联,由星号分隔。这里的好处是hg qfold 将在您使用 bash 并获取 hg-completion 脚本的情况下完成补丁。这留下了这样的历史,其中 A+B+C 是一个单一的提交,它是我们感兴趣的 3 个补丁的组合:
---O---O---A+B+C
另一个用例是如果我们有与以前相同的历史记录,但我们想删除补丁 B 并合并 A+C。这实际上与上面非常相似。当您进入 qfold 步骤时,您只需折叠最后一次提交而不是最后 2 次提交:
$ hg qfold -e 103.diff
这会将 B 的更改留在补丁队列中,但它不会应用于工作副本,并且它的提交不在历史记录中。你可以通过运行看到这一点:
$ hg qunapplied
102.diff
历史现在看起来像这样,其中 A+C 是一个合并了更改 A 和 C 的单个提交:
---O---O---A+C
最后一个用例可能是您只需要应用提交 C。您可以通过运行上面的 qimport 来做到这一点,并且您会弹出所有您不想要的补丁:
$ hg qpop -a
-a 标志意味着弹出所有补丁。现在您可以只申请您想要的:
$ hg qpush 103.diff
这会给你留下这段历史:
---O---O---C
完成所有这些后,您需要完成队列摆弄。这可以通过以下方式完成:
$ hg qfinish -a
所以我们到了。您现在可以运行 hg push 并仅提交您想要的内容,或者 hg email 向邮件列表发送一个连贯的补丁。