2012-11-16 18 views
0

假設我有沒有分支這樣的修訂歷史:分公司,其中包括非連續修訂

1 
2 
3 
4 

現在,我想在我的存儲庫中創建一個新的分支版本13,但不能修改24。修訂版2/3中沒有衝突的更新。有沒有辦法做到這一點。我的最終處置庫應該有兩個分支這樣的:

4 
3 
2 3 
|/
|/ 
1  
+0

@Lazy Badger,你爲什麼從主分支中刪除版本3?如果可能,我想在那裏。 –

+0

如果我的印象不對 - 我會解決它。主線將1-2-3-4,只有3 ** **複製到新的父母,是嗎? –

+0

是的。對不起,如果最初不明確。 –

回答

3

如果您已經發布此回購的公共場所(或任何開發者已經克隆你的回購),您可以用graftbackout組合做到這一點。

graft命令會將一個提交從一個分支複製到另一個分支。 backout命令將反轉先前提交所做的更改。

下面的例子應該複製您的情況:

hg init test 
echo test>>test\test.txt && hg -R test ci -Am "baseline" 
echo test>>test\test.txt && hg -R test ci -Am "changeset 1" 
echo test>>test\test.txt && hg -R test ci -Am "changeset 2" 
echo new>>test\new.txt && hg -R test ci -Am "changeset 3" 
echo test>>test\test.txt && hg -R test ci -Am "changeset 4" 
hg -R test backout -r 3 
hg -R test ci -m "backed out changeset 3" 
hg -R test update -r 1 
hg -R test graft -r 3 
hg -R test glog --template "{desc}\n" 

這將創建你想改變一個新的匿名分支,同時刪除從原來的分支轉3的變化,無需修改庫的歷史。

這導致以下日誌:

@ changeset 3 
| 
| o backed out changeset 3 
| | 
| o changeset 4 
| | 
| o changeset 3 
| | 
| o changeset 2 
|/ 
o changeset 1 
| 
o baseline 
+0

錯誤....用於線性單分支歷史。退出只是從另一個故事 –

+0

@LazyBadger:我已經更新了我的答案......你能更詳細地解釋你的反對意見嗎?我不明白你的意思是「退出只是來自另一個故事」。 –

+0

我不能在評論中顯示'glog',但我測試過 - 你會得到另一棵樹,而不是OP請求重寫:backout創建額外的提交 –

2

因爲你說過任何關於命名分支,我們與匿名分支

前工作:

>hg glog --template "{rev}:{desc}\n" 
@ 3:Added d.txt 
| 
o 2:Added c.txt 
| 
o 1:Added b.txt 
| 
o 0:Initial commit 

>hg rebase -s 2 -d 0 

>hg glog --template "{rev}:{desc}\n" 

@ 3:Added d.txt 
| 
o 2:Added c.txt 
| 
| o 1:Added b.txt 
|/ 
o 0:Initial commit 

>hg rebase -s 3 -d 1 

>hg glog --template "{rev}:{desc}\n" 
@ 3:Added c.txt 
| 
| o 2:Added d.txt 
| | 
o | 1:Added b.txt 
|/ 
o 0:Initial commit 

在命名分支的情況下,你在第一次rebase之前必須hg branch BRANCHNAMEhg ci -m "Creating branch",在rebase中使用-d 4而不是0

+2

肯定值得引發警告,如果你已經在某個地方推出了這個回購,那麼爲了換底就太遲了。 –

+0

@ Ry4an:階段廢棄了這種警告 –

+0

大多數人仍然沒有運行階段構建。我會留下警告。 –

0

從您的意見,這聽起來像你想實現什麼是所謂的「採櫻桃謬誤」:有選擇地一些變更復制到另一個分支,沒有把他們當作一個合併。如果這是正確的,您可以通過首先在版本1中創建普通分支,然後將其複製到要複製的變更集上。命令hg graft是專爲此目的而設計的。

下面是它如何與一個名爲分支,selective工作。如果您想要無名分支,只需省略分支創建。

hg update -r 1 
hg branch selective 
hg graft -r 3 

結果會是這樣的(其中,我希望,是你想要的):

4 
| 
3 
| 5 = 3 
2/
|/ 
1 
| 
0 

默認情況下,移植物將複製用戶,日期和說明從源頭變更(S )。新修訂版與修訂版3具有相同的效果,但會有新的數字和哈希ID。 Mercurial將不會意識到修訂3和5之間的關係。

無法有選擇地導入某些更改集並將操作視爲合併:合併始終將完整(線性)歷史記錄統一到合併點。