在Mercurial队列顶部撤消意外的hg修改

时间:2018-03-11 11:28:36

标签: mercurial mercurial-queue

以下命令序列要求启用Mercurial Queues exension,以及Evolve扩展(对于hg amend,别名hg refresh)。

这些命令组合会破坏现有的Mercurial队列,使得对应于推送的补丁的提交过时,并创建一个具有完全相同内容的新提交。

理论上这个错误很容易实现:只需输入hg ref而不是hg qref,但我最近在使用Mercurial Queues之后才开始使用它。无论如何,我还没有想出一个干净的方法来解决这个问题并恢复原状。

请注意,简单的hg rollback在我的示例中有效,但我不确定它是否适用于我的情况,因为我尝试过其他尝试解决此问题的方法。无论如何,hg rollback并不是人们应该依赖的东西。 总之,如何撤消hg amend并取回我应用的MQ补丁?

#!/bin/sh                                                                                                                                                                

hg init test
cd test
echo "This is foo" >> foo
hg add
hg ci -m "Add foo"
hg init --mq
echo "Line 2 of foo" >> foo
hg qnew p
hg ci --mq -m "Add patch p"
hg ref


hg log -vG --hidden
@  changeset:   2:f7f038d3aab5
|  tag:         tip
|  parent:      0:9d3a95922194
|  user:        Faheem Mitha <faheem@faheem.info>
|  date:        Sun Mar 11 16:38:51 2018 +0530
|  files:       foo
|  description:
|  [mq]: p
|
|
| x  changeset:   1:e467a2433c7f
|/   tag:         p
|    tag:         qbase
|    tag:         qtip
|    user:        Faheem Mitha <faheem@faheem.info>
|    date:        Sun Mar 11 16:38:50 2018 +0530
|    obsolete:    rewritten using amend as 2:f7f038d3aab5 by Faheem Mitha <faheem@faheem.info> (at 2018-03-11 16:38 +0530)
|    obsolete:    rewritten by Faheem Mitha <faheem@faheem.info> as f7f038d3aab5 (at 2018-03-11 16:38 +0530)
|    files:       foo
|    description:
|    [mq]: p
|
|
o  changeset:   0:9d3a95922194
   tag:         qparent
   user:        Faheem Mitha <faheem@faheem.info>
   date:        Sun Mar 11 16:38:50 2018 +0530
   files:       foo
   description:
   Add foo

1 个答案:

答案 0 :(得分:1)

这不是我的测试用例。我还需要一个

echo "Line 3" >> foo

在hg ref之前。此外,版本控制你的mq似乎无关紧要;我认为您可以删除hg init --mqhg ci --mq行。

hg修正确实应该阻止它。但是,如果您想手动修复,请编辑.hg / patches / series并使用后继哈希替换过时的哈希。 (只需确保使用20字节的哈希值,例如hg log -T '{node}\n')。

警告:当我尝试使用你的测试用例和qpopped时,旧的头部神秘地取消了它,它给出了一个奇怪的警告:当前目录不是头部(尽管列出了hg log -r 'head()'。)但至少你让你的队列回到了工作状态。