假设我有这个:
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
命令玩了一下,我能够达到我想要的效果,但我想知道是否还有其他方法。
答案 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
已经被推送到集中式仓库并被其他人撤回,那么这一点尤其重要。