在Mercurial中,分支(在同一個存儲庫中使用hg分支創建)目前是不可逆的。一旦引入,您只能通過執行歷史重寫將它們從分支名稱空間中移除。這就是爲什麼如果項目生命週期很短(只有少數功能分支)或分支足夠通用以保持多年(如「穩定」,「錯誤修正」等),我纔會創建真正的分支。據我所知,分支機構(和所有其他產品一樣)在沒有你的控制的情況下在本地創建,所以如果有人決定使用分支,該分支將在拉/推之後顯示在主存儲庫中。
效果是 - 在你的結構 - 從發展拉入穩定後,你也會得到特徵1和特徵2分支合併爲穩定,是相當無用的。拉穩定到發展因爲你固定錯誤在穩定版本也將合併分支錯誤到發展。您可以嘗試通過創建穩定庫,將其克隆到發展,分公司特徵1在發展和拉發展到穩定(提交這些步驟之間的一些變化):分支名字會與非活動的頭出現在穩定雖然你它合併:
stable $ hg branches
default 4:1c3cd0d1a523
feature2 3:82879465c5f3
feature1 2:5d7480426f21 (inactive)
bugs 1:116860d2d85e (inactive)
我記得,Git是能夠刪除分支,但水銀有一定的發展能上的貓討論這個話題;我不確定這是否仍然是最新的,所以如果我錯了,請糾正我。
[編輯]根據Mercurial wiki中的Pruning Dead Branches,有4種方法可以「移除」一個分支。真正永久的唯一途徑刪除分支名稱,而不僅僅是關閉(取消激活),它是通過用已清除的歷史記錄替換存儲庫。
從我所聽到和看到的,使用Mercurial時創建克隆而不是分支更常見。我記得去年當我從SVN轉到Mercurial時,和你有同樣的想法。通常的做法與中央版本控制不同,因爲分支可以在任何時候發生,而無需集中控制它,所以克隆是「分支」以不污染分支名稱空間並保持開發分離和靈活的首選方式(您將始終檢索完整的存儲庫,如果你拉/克隆包括所有分支機構,如果你只是想分支測試的東西,你將不得不選擇一個獨特的分支名稱是永久性的,因此將出現在項目中的每個人)。儘管這種方法似乎浪費了磁盤空間,並且需要跟蹤分支機構的位置(通常位於用戶帳戶和IDE內的某個項目文件夾中),但它似乎是一種更加靈活和實用的處理方式分支機構。 (它讀取比當你真正自己使用它更困難)
已經有一些使用水銀較小的項目,這是我們公司什麼工作至今(每個項目只有幾個活躍的開發者):
在服務器上:
項目名稱,主要
發展被推到並從那裏拉;這就是「權威」開發「分支」,以保持團隊的庫同步
項目名稱穩定
如果一個版本得到釋放/部署這就是- 主被推向;只有錯誤修正是在- 穩定的完成,然後拉回到- 主要:根據Mercurial Guide by Bryan O'Sullivan的建議,修正了被認爲更穩定的版本(例如,以前的版本)通常可以撤回到開發分支中,但開發分支中的更改可能包含更新的不穩定功能,除非發佈發佈(或類似),否則不應將其拉入維護分支。
本地開發者的機器:
項目名稱,主要克隆一次,正在處理和同步做一個拉(+合併),並定期推回服務器。
如果有一個功能「分支」需要我們克隆- 主(本地或服務器),並將其命名爲克隆「項目名稱 - featuredescription」。爲了備份目的或集中式共享,我們還在服務器端創建一個克隆並推送到那裏。如果要素是準備- 主,我們拉-featuredescription到我們當地- 主,合併更改,拉- 主從服務器,再次合併,推動- 主回服務器。如果變化發生- 主而我們在-featuredescription工作,我們可以很容易地從- 主拉和合並的變化(不推回- 主但因爲我們不希望該功能在那裏然而)。
與真正的分支相比,不利的一面是,在與父母合併後,您無法輕易識別出哪些變更集來自哪裏。但是這對我們來說還沒有問題(提交消息足夠有用,或者一旦將特徵分支與其父庫進行合併,則特徵分支的分離是無趣的)。
思考更大的項目我想出了以下應該工作的方案(但我還沒有使用它)類似於集中版本控制。它依賴於對服務器端「權威」存儲庫的有限寫訪問,因此只有特權開發者(項目負責人)纔可以合併並推送到那裏。此外,還有一臺CI服務器作爲另一個存儲庫的網守- 主要測試的,它是- 主要的一個子集,僅包含CI批准的變更集,並略有延遲。
在服務器:
項目名稱,主要
發展;只有少數人有寫權限,主要變化需要由他們拉動;他們是在什麼特徵的分支合併
控制
項目名稱,主要測試
發展;沒有人應該在這裏寫,除非出現了問題,因爲測試意味着持續集成系統,成功地建立了- 主推那個版本爲- 主要測試,所以在這裏的代碼進行驗證,不應該打破編譯或測試
的projectname穩定
的projectname穩定測試
要穩定的 「分支」 相同的策略;和以前一樣,我們推- 主上發佈和bug修正工作,穩定版穩定版,測試是CI批准
當然,我們需要有多個倉庫的地方在那裏的球隊/開發者實際上可以推動他們的日常工作,因爲-主現在僅用於權威性更改(當然,他們可以完全在本地工作,但他們必須同步某處,如果他們不喜歡使用hg serve彼此同步或設置自己的服務器或關心備份)。
減少提交和存儲庫/分支的另一個選擇是使用mq擴展來處理修補程序隊列。但是,我發現使用克隆或分支更容易,至少對於小型項目來說。