2011-01-12 91 views
117

我對本地存儲庫提交了一些更改,但尚未推送。由於某個功能的使用時間比預期的要長,因此我希望在推送之前將這些更改交換到命名的分支上。我怎樣才能做到這一點?Mercurial將更改移至新分支

+2

可能的重複[如何將某些變更集移動到新的分支在mercurial](http://stackoverflow.com/questions/2219756/how-to-move-some-changeset-to-a-new-branch- in-mercurial) –

回答

147

至於建議的關口,MqExtension是你的問題的解決方案。恕我直言,一個更簡單的工作流程是使用rebase extension。假設你有一個歷史是這樣的:

@ changeset: 2:81b92083cb1d 
| tag:   tip 
| summary:  my new feature: edit file a 
| 
o changeset: 1:8bdc4508ac7b 
| summary:  my new feature: add file b 
| 
o changeset: 0:d554afd54164 
    summary:  initial 

這意味着,修訂0是你開始你的工作特性的基礎。現在您想要在指定的分支上修改1-2,比如說my-feature。更新至版本0,並創建一個分支:

$ hg up 0 
$ hg branch my-feature 
$ hg ci -m "start new branch my-feature" 

歷史,現在看起來是這樣的:

@ changeset: 3:b5939750b911 
| branch:  my-feature 
| tag:   tip 
| parent:  0:d554afd54164 
| summary:  start new branch my-feature 
| 
| o changeset: 2:81b92083cb1d 
| | summary:  my new feature: edit file a 
| | 
| o changeset: 1:8bdc4508ac7b 
|/ summary:  my new feature: add file b 
| 
o changeset: 0:d554afd54164 
    summary:  initial 

使用rebase命令將修訂1-2到修訂3

$ hg rebase -s 1 -d 3 

這結果如下圖:

@ changeset: 3:88a90f9bbde7 
| branch:  my-feature 
| tag:   tip 
| summary:  my new feature: edit file a 
| 
o changeset: 2:38f5adf2cf4b 
| branch:  my-feature 
| summary:  my new feature: add file b 
| 
o changeset: 1:b5939750b911 
| branch:  my-feature 
| summary:  start new branch my-feature 
| 
o changeset: 0:d554afd54164 
    summary:  initial 

就是這樣..正如馬克的回答中所提到的那樣,移動已經推動的變更集通常是一個壞主意,除非你在一個小團隊中工作,你可以溝通和執行你的歷史操縱。

+4

恕我直言,這種解決方案的缺點是它引入了「啓動新分支我的功能」啞提交(即不會更改任何文件)。 – sschuberth

+7

@sschuberth:我認爲在這裏明確表達是件好事。如果額外的變更集對您來說是一個問題,請將其與後面的變更集結合使用(例如,通過使用現在內置的[histedit](http://mercurial.selenic.com/wiki/HisteditExtension)擴展名的'fold'命令)。 –

+0

如何用ASCII樹打印日誌? –

30

您可以使用MqExtension。比方說,變更集移動洋洋灑灑1-3:

hg qimport -r 1:3 # convert revisions to patches 
hg qpop -a   # remove all them from history 
hg branch new  # start a new branch 
hg qpush -a   # push them all back into history 
hg qfin -a   # finalize the patches 
+0

我想導入63:64和66:68。我正在修訂65是不是64的父母 – Casebash

+0

你想用65做什麼? Mq只能從頭部轉換連續的變更集。它通常將不可變的變更集變成可編輯的可變補丁。這改變了哈希(影響所有孩子),所以你不能跳過。 –

+0

我在主分支上進行了多項更改(包括65),並推送 – Casebash

9

我喜歡的補丁解決方案由Mark Tolonen描述here

我有什麼:

hg log -G 

#default branch 
@ changeset: 3:cb292fcdbde1 
| 
o changeset: 2:e746dceba503 
| 
o changeset: 1:2d50c7ab6b8f 
| 
o changeset: 0:c22be856358b 

我想要什麼:

@ changeset: 3:0e85ae268e35 
    | branch:  feature/my_feature 
    | 
    o changeset: 2:1450cb9ec349 
    | branch:  feature/my_feature 
    | 
    o changeset: 1:7b9836f25f28 
    | branch:  feature/my_feature 
    | 
/
| 
o changeset: 0:c22be856358b 

汞命令:

hg export -o feature.diff 1 2 3 
hg update 0 
hg branch feature/my_feature 
hg import feature.diff 

這裏是我的本地庫的

@ changeset: 6:0e85ae268e35 
| branch:  feature/my_feature 
| 
o changeset: 5:1450cb9ec349 
| branch:  feature/my_feature 
| 
o changeset: 4:7b9836f25f28 
| branch:  feature/my_feature 
| 
| o changeset: 3:cb292fcdbde1 
| | 
| o changeset: 2:e746dceba503 
| | 
| o changeset: 1:2d50c7ab6b8f 
|/ 
| 
o changeset: 0:c22be856358b 

現在我需要從我的默認分支刪除修訂版1 2和3的狀態。 您可以使用mq擴展名中的strip命令執行此操作。 hg strip從存儲庫中刪除變更集及其所有後代。

通過將以下行添加到配置文件(.hgrc或Mercurial)來啓用擴展。INI):

vim ~/.hgrc並添加:

[extensions] 
mq = 

現在剝離這種儲存庫版本1.

hg strip 1 

我們在這裏

@ changeset: 3:0e85ae268e35 
| branch:  feature/my_feature 
| 
o changeset: 2:1450cb9ec349 
| branch:  feature/my_feature 
| 
o changeset: 1:7b9836f25f28 
| branch:  feature/my_feature 
| 
o changeset: 0:c22be856358b 

注:更改集不同但版本相同

5

對於那些傾向於使用GUI

  1. 轉到Tortoise Hg - >File - >Settings然後剔rebase

enter image description here

  • 重啓龜UI

  • 創建新的分支,你將被移動的變化。點擊當前分行名稱 - >選擇Open a new named branch - >選擇分行名稱。

  • enter image description here

  • 如果沒有做出要移動變化public(如draft)到5(如果改變已經公佈和你不是高級開發人員,你應該與某個高級人員談話(請準備替罪羊),因爲你可能會把事情搞得一團糟,我不承擔任何責任:))。
  • 轉到View - >Show Console(或按Ctrl +大號) 然後在控制檯hg phase -f -d 2寫 - 其中2最低版本,你會被轉移到新的分支。

  • 轉到分支和修訂(應該是最上面的修訂如果要移動的變化在步驟3中創建新的分支)Right Mouse - >Update

  • 轉到分支和revsion你會從Right Mouse被移動的變化 - >Modify History - >Rebase

  • enter image description here

  • 點擊Rebase並祈禱沒有衝突,如果你必須合併。

  • 推送更改,此時所有修訂仍應爲draft

  • 轉至您正在將分支移至Right MouseChange Phase toPublic的分支的最高修訂版。

  • enter image description here

    希望這可以節省一些時間。

    +0

    太棒了!去試試這個,但只有一個問題 - 爲什麼在最後階段將公共階段改爲公開? 「在遠程存儲庫中看到的任何變更集都是公開的」,所以當你推動它時,它不會被設置爲公共嗎? –

    +0

    @JoshLeeDucks推動時,他們不會再自動改變爲「公共」(至少對我而言他們不會)。 –

    相關問題