Mercurial 有没有其他方法可以移除多个磁头?

Mercurial 有没有其他方法可以移除多个磁头?,mercurial,Mercurial,假设我有这个: hg init touch a hg add a hg commit -m a touch b hg add b hg commit -m b hg up -r 0 touch c hg add c hg commit -m c 现在,由于最后一次提交,我将有多个头部。例如,如果我想保留最后一个头部,即由commitc创建的头部(实际上放弃了b,以及在第一个头部之后进行的所有其他提交),我该怎么做?我使用了mq的strip命令,我能够实现我想要的,但我想知道是否还有其他

假设我有这个:

hg init

touch a
hg add a
hg commit -m a

touch b
hg add b
hg commit -m b

hg up -r 0

touch c
hg add c
hg commit -m c

现在,由于最后一次提交,我将有多个头部。例如,如果我想保留最后一个头部,即由commit
c
创建的头部(实际上放弃了b,以及在第一个头部之后进行的所有其他提交),我该怎么做?我使用了mq的
strip
命令,我能够实现我想要的,但我想知道是否还有其他方法。

是的,还有其他方法。从上面的示例来看,
hg glog
的输出有点像这样:

@  changeset:   2:925573c7103c
|  tag:         tip
|  parent:      0:4fe26dfe856d
|  user:        Joel B Fant
|  date:        Thu Jul 28 23:20:45 2011 -0400
|  summary:     c
|
| o  changeset:   1:9dc928176506
|/   user:        Joel B Fant
|    date:        Thu Jul 28 23:20:24 2011 -0400
|    summary:     b
|
o  changeset:   0:4fe26dfe856d
   user:        Joel B Fant
   date:        Thu Jul 28 23:20:12 2011 -0400
   summary:     a
如果克隆
test
指定一个修订版,则它将只克隆该修订版及其祖先版本。因此,如果您的回购协议目录为TwoHeadMightBeBetter,您可以转到其父目录并发布:

hg clone TwoHeadsMightNotBeBetter OneHeadIsFine -r 925573c7103c
我在其中指定了变更集id,但您也可以使用
-r2
,或者甚至
-r-tip
,因为它当前是该回购的提示。现在,当您进入新克隆并执行
hg glog
时,您只有一个头部:

@  changeset:   1:925573c7103c
|  tag:         tip
|  user:        Joel B Fant
|  date:        Thu Jul 28 23:20:45 2011 -0400
|  summary:     c
|
o  changeset:   0:4fe26dfe856d
   user:        Joel B Fant
   date:        Thu Jul 28 23:20:12 2011 -0400
   summary:     a


如果你有3个脑袋,想留下2个,那就有点不同了。您必须使用
-r
克隆其中一个分支,并在
hg pull
上指定
-r
,以提取特定分支。

您还可以对包含
b
的变更集执行虚拟合并(本例中为变更集1):


请注意,在这种情况下,您没有重写任何历史记录或创建任何新的回购——如果
b
已经被推到集中回购并被其他人拉走,这一点尤为重要。

我想没有
断头台
命令?我认为它已被弃用:)
hg strip
正适合该任务。不过,Joel建议的hg clone-r…也很完美。您必须决定是要清理现有克隆还是要清理新克隆。或者在克隆时多次指定
-r
,或者使用revset。
$ hg --config ui.merge=internal:fail merge 1
resolving manifests
getting b
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

$ hg revert --all --no-backup --rev .
removing b

$ hg status
R b

$ hg commit -m "Dummy merge -- eliminate b"
committed changeset 3:c163151f19df

$ ls
a  c