2011-07-28 70 views
1

比方說,我有這樣的:是否有另一種刪除多個頭的方法?

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 

現在我將有多個噴頭,因爲最後的提交。例如,如果我想保留最後一個頭,就是由承諾c(有效地丟棄b,以及在第一個之後做出的所有其他提交)創建的頭,我該怎麼做?我玩了一下mq的strip命令,我能夠實現我想要的,但我想知道是否有另一種方法。

+0

我不認爲有'guillotine'命令? – aroth

+0

我認爲它已被棄用:) – Senthess

+0

'hg strip'只是完美的任務。雖然,Joel建議的'hg clone -r ...'也是完美的。您必須決定是否要清理**現有的**克隆,或者是否需要乾淨的**新**。 –

回答

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指定某個版本,只會克隆該修訂及其祖先。所以,如果你的回購的目錄爲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克隆其中的一個,並在hg pull上指定-r來提取特定的分支。

+1

或者在克隆時多次指定'-r',或使用revset。 –

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已被推送到集中回購並被其他人拉回。

相關問題