是否有另一种方法可以移除多个头?

时间:2011-07-28 23:37:12

标签: 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

现在我将有多个头,因为最后一次提交。例如,如果我想保留最后一个头,那是由commit c创建的(有效地丢弃b,以及在第一个之后做出的所有其他提交),我该怎么办呢?我用mq的strip命令玩了一下,我能够达到我想要的效果,但我想知道是否还有其他方法。

2 个答案:

答案 0 :(得分:2)

是的,还有另一种方式。从上面的示例中,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指定修订,则只会克隆该修订及其祖先。因此,如果您的repo的目录是TwoHeadsMightNotBeBetter,您可以转到其父目录并发出:

hg clone TwoHeadsMightNotBeBetter OneHeadIsFine -r 925573c7103c

我在其中指定了变更集ID,但您也可以使用-r 2,甚至-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克隆其中一个,并在-r上指定hg pull以提取特定分支。

答案 1 :(得分:2)

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

$ 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

请注意,在这种情况下,您没有重写任何历史记录或创建任何新的回购 - 如果b已经被推送到集中式仓库并被其他人撤回,那么这一点尤其重要。