2011-04-18 90 views
2

我有一個存儲庫masterdevelop分支。如何將分支更新爲Mercurial中不同分支上的標籤狀態?

我想創建第三個命名分支,比如說它叫做bugfixes

我希望能夠更新到bugfixes,然後bugfixes的提示與master上的以前的標記相同。 (說這個標籤叫做Release5.1)。

我試着更新到分支,然後更新到標籤,但是將分支切換回master(其中標籤是)。我也嘗試合併

hg merge -r Release5.1

但是,只有在變化帶來的,並沒有引起分支「回到過去」。

如何將該標記獲取到指定分支的頂端?

我在問這個問題,因爲我的CruiseControl.net傢伙告訴我,我們只能建立分支的提示,而不是脫離特定的修訂。 (也許這是另一個問題....)

回答

2

首先是一些基本知識:

梅傑斯是定向:

  • 當合並bugfixesmaster,然後master得到犯下的bugfixes分支的變更。
  • 當您將master合併到bugfixes時,則會發生相反情況。

如果你想要兩個分支互相鏡像,那麼你必須在兩個方向上進行合併。


我認爲你不需要bugfixes分支的。相反,我會集,說一個政策:

  • master應該總是能夠被髮布
  • Bug修復致力於爲master
  • 所有版本都在master
  • 新標籤的狀態功能致力於develop
  • 何時該發佈,develop合併爲master
  • 每次發佈後,master合併到develop以確保新功能基於最新版本。

這將導致這樣的事情:

workflow with no bugfixes branch


如果你必須有一個bugfixes分支,然後我設置這樣的政策:

  • master應始終處於可能被釋放的狀態
  • 所有版本都在master
  • Bug修復標籤致力於爲bugfixes
  • 新功能致力於develop
  • 當它的時間爲一個bug修復版本:
    1. 合併bugfixesmaster
    2. 標籤master
    3. master合併爲bugfixes以使它們匹配
    4. master合併到develop以確保新功能基於最新版本。
  • 當是時候爲主要版本:
    1. 合併bugfixesmaster
    2. 合併developmaster
    3. 標籤master
    4. 合併masterbugfixes使它們相匹配
    5. master合併爲develop t o確保新功能是基於最新的

這將導致一些看起來像這樣:

workflow with bugfix branch


要在舊版本修復的bug ,您應該:

hg update <TAG> 
hg branch Release1.x 
<fix the bug> 
hg commit -m "Bug fix to older version" 
hg tag Release1.2 

...if the bug is present in master, then you should also: 
hg update master 
hg merge Release1.x 
hg commit -m "merged bug fix in Release1.x to master" 

這將導致這樣的事情:

bug fix to older release

注1:在這一點上,master已經提交它永遠不應爲一個Release1.x發佈的一部分。因此,您絕不應將master併入Release1.x

注意2:如果您必須在該字段中支持產品的多個版本,則通常爲每個主要版本都有一個命名分支。這些長期運行的命名分支僅用於錯誤修復。如果您非常小心,可以將錯誤修復從一個發佈分支合併到另一個發佈分支,但根據我的經驗,使用hg transplant來更新分支之間的更改更爲常見。

+0

蒂姆 - 感謝您花時間回答,但我認爲您沒有完全解決我的問題。我可以進一步強加嗎?我的問題是,我需要修正一個錯誤修復「主過去」的時間點。例如,我們已經發布了5.0和5.1。現在我需要發佈一個針對5.0的錯誤修復。如何獲得基於5.0代碼庫的命名分支? – 2011-04-18 15:39:21

+0

@Nick:我在我的答案中添加了一個部分,用於修復舊版本中的錯誤。 – 2011-04-18 16:47:11

+0

非常感謝。 – 2011-04-18 19:27:26

1

我建議你保持bugfixes分支基本上是master分支的一個鏡像,除了當你修復一個bug時,一旦錯誤被修復,合併bugfix返回到master再次同步它們。

如果您需要維護master的多箇舊版本,您可能需要爲每個需要維護的舊版本分配一個bugfix命名分支。

理想情況下,您不需要專用於錯誤修復的命名分支。很多Mercurial的力量來自於從以前的版本(未命名的分支)分支的容易程度。我不是太熟悉CruiseControl.net,但如果你能蓄客不願透露姓名的分支,那麼所有你必須做的是:

  1. 更新到要立足於
  2. 進行修正標籤變化
  3. 提交(這會讓一個無名分支)
  4. 構建/測試的未命名的新枝的頂端
  5. 標記的新版本
  6. 合併爲需要確保所有的代碼行獲得的bug修復

由於Mercurial的內部散列結構是如何工作的,從「堆棧」(或將新的更改集插入堆棧,取決於你如何看待它)開始變化是一件非常非常困難的事情,很可能會打破任何你正在工作的克隆庫。