假設我有沒有分支這樣的修訂歷史:分公司,其中包括非連續修訂
1
2
3
4
現在,我想在我的存儲庫中創建一個新的分支版本1
和3
,但不能修改2
或4
。修訂版2
/3
中沒有衝突的更新。有沒有辦法做到這一點。我的最終處置庫應該有兩個分支這樣的:
4
3
2 3
|/
|/
1
假設我有沒有分支這樣的修訂歷史:分公司,其中包括非連續修訂
1
2
3
4
現在,我想在我的存儲庫中創建一個新的分支版本1
和3
,但不能修改2
或4
。修訂版2
/3
中沒有衝突的更新。有沒有辦法做到這一點。我的最終處置庫應該有兩個分支這樣的:
4
3
2 3
|/
|/
1
如果您已經發布此回購的公共場所(或任何開發者已經克隆你的回購),您可以用graft
和backout
組合做到這一點。
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
錯誤....用於線性單分支歷史。退出只是從另一個故事 –
@LazyBadger:我已經更新了我的答案......你能更詳細地解釋你的反對意見嗎?我不明白你的意思是「退出只是來自另一個故事」。 –
我不能在評論中顯示'glog',但我測試過 - 你會得到另一棵樹,而不是OP請求重寫:backout創建額外的提交 –
因爲你說過任何關於命名分支,我們與匿名分支
前工作:
>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 BRANCHNAME
和hg ci -m "Creating branch"
,在rebase中使用-d 4而不是0
肯定值得引發警告,如果你已經在某個地方推出了這個回購,那麼爲了換底就太遲了。 –
@ Ry4an:階段廢棄了這種警告 –
大多數人仍然沒有運行階段構建。我會留下警告。 –
從您的意見,這聽起來像你想實現什麼是所謂的「採櫻桃謬誤」:有選擇地一些變更復制到另一個分支,沒有把他們當作一個合併。如果這是正確的,您可以通過首先在版本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之間的關係。
無法有選擇地導入某些更改集並將操作視爲合併:合併始終將完整(線性)歷史記錄統一到合併點。
@Lazy Badger,你爲什麼從主分支中刪除版本3?如果可能,我想在那裏。 –
如果我的印象不對 - 我會解決它。主線將1-2-3-4,只有3 ** **複製到新的父母,是嗎? –
是的。對不起,如果最初不明確。 –