網絡上版本管理系統之爭持久而喧囂,依照聲量來說目前應該是Git佔了較大的優點。不過咱們本文的關注點在於代碼的分支管理模型,由於你們不管是用SVN或者Git,目的是爲了解決研發過程管理中的實際問題。我這裏整理幾種分支管理模型,這樣你們能夠對照本身的痛點選擇合適的模型。不過並非最靈活的方案就最好,靈活意味着分支的管理和具體研發學習曲線都更復雜。git
我先根據實際生產過程當中企業面臨的問題列出一個清單:網絡
另外也交代一下我所在的公司背景:
咱們是一家企業內部學習培訓的人力資源SAAS管理平臺,對於平臺改進有本身的規劃和目標,可是又面臨着大客戶的定製化需求以及交付時間壓力。技術棧仍是Java和.Net 雙棧並存,因此能夠說是最複雜的研發環境了。咱們也慢慢衍生出了本身的一套改進的代碼版本管理模型。工具
原理1:研發團隊在名稱爲 Trunk 的單一分支進行開發,當開發工做到必定階段的時候達到可發佈條件後,切出Release分支進行發佈,而且Release分支是不能夠修改的僅僅作發佈使用。大部分SVN用戶是基於本模型進行開發。
適合小團隊的模型,你們都直接在Trunk上進行開發
post
適合較大團隊的模型,你們切出短時間的特性分支進行開發,完成後合併回Trunk。
學習
適用場景:適合於單一穩定產品線,迭代排期穩定,需求邊界徹底可控的團隊。
優勢:模型簡單
缺點:測試
總結:Trunk Based最大的優點就是清晰簡單,付出的代價就是靈活性,基本能夠說不存在任何靈活性。適用的場景我以爲是進入到後期維護的大型系統,不會作太多的變動而且不會有太多的突發問題。插件
GitFlow來源應該是 Vincent Driessen 在2010年1月發表的這篇《A successful Git branching model》,基本是如今Git中最出名的流程管理方法了。
3d
這張圖相信你們都不陌生。
原理:
主要分爲5個分支code
總結:Gitflow已經很偏向互聯網風格的代碼管理,考慮到了多環境、線上修正。並且如今不少IDE或者工具備整合了GitFlow的插件使用起來會更簡單。對於有良好規劃和進度控制的項目,應該是已經夠用了。可是對於一些有交付日期的,可是需求池能夠調整的項目可能還不夠靈活。
阿里的研發效能事業部專家基於TrunkBased和GitFlow提出了一套新思路:AoneFlow。
原理:AoneFlow 只使用三種分支類型:主幹分支、特性分支、發佈分支,以及三條基本規則。
開始工做前,從主幹建立特性分支。
經過合併特性分支,造成發佈分支。
發佈到線上正式環境後,合併相應的發佈分支到主幹,在主幹添加標籤,同時刪除該發佈分支關聯的特性分支。
缺點:
總結:AoneFlow最重要的點,就是保證master分支可用和隨時可發佈,其餘可能都是臨時分支。因此取名的時候應該是Ali-One-Flow,這個含義。臨時分支的組裝就有不少種玩法了,須要企業根據本身的須要來定製處理。
OneFlow我找到兩個版本,一個是國內版本,一個是國外的版本。
國內版本:
原理:此模式是TrunkBased的升級版,增長了Hotfix分支,採用多主幹模式,通常是雙主幹(一個主幹分支+一個主幹發佈分支)。OneFlow在TrunkBased模式演進中,作了一此改善,分離了主幹分支和發佈分支,有效的規避了一些問題。可是一樣還不能知足多版本,多產品的並行開發。
國外版本:
原理:此模式是GitFlow的簡化版本,可是(做者認爲)並不比GitFlow遜色。主要也就是雙分支2,除了主幹分支,只會額外保持一個分支,在不一樣的階段切除特性、發佈、修正分支
並且還提供了變種版本,master+develop 雙主幹分支的模式。
總結:國外版本的OneFlow發表在2017年,我以爲他肯定了基於一個,最多兩個的固定分支進行開發這種原則。提供了企業版本管理過程當中的最佳實踐原則,(我以爲)也啓發了AoneFlow這種優秀的Flow。
ExeFlow是咱們公司目前在使用的代碼管理流程的名稱,主要是吸收了AoneFlow的思想,同時根據咱們本身的環境進行一些流程和分支的固化。
要理解這個Flow流程,首先基於咱們的實際工做場景:
咱們的系統因爲主要是面向大型企業內部使用,存在複雜的分發流程和權限控制,通過長時間的累積業務模型也很複雜各類關聯和引用,因此有一些大型任務的開發週期可能會比較長,到達2-3個月的週期。
咱們的迭代週期正常是1個月。流程大概以下:
主要經歷了2個大版本的變化
版本1,基本是參考GitFlow
這個版本的固定獨立分支是三條:Master,Develop,Local。核心在於Release分支仍是由Develop創建,對於需求變動的支持性不夠靈活。
版本2,是參考AoneFlow
(上圖就是使用gitgraphjs繪製的)
這個版本的固定獨立分支也仍是是三條:Master,Develop,Local。
可是核心差別在於Release分支是由Master創建,而且合併須要上線的Feature分支,而Release分支在咱們企業的流程中只會存在2-3天的時間。
總結:實際上是比較複雜的流程,並且研發的操做的內容實際更多。咱們還要鎖定某些分支,設定權限管理。可是解決了咱們的問題,因此從上到下都能替換到複雜流程帶來的好處。
若是你完整看完了這篇文章,實際上如今須要的並非立刻選擇當前企業應該選用哪種Flow管理模型,而是認真的思考企業實際面臨的問題和痛點。越靈活的流程越複雜,對於研發人員初期的接收難度就越高。咱們想真正讓研發團隊理解並接受某個管理模型,最重要的是這個東西解決了企業面臨的問題。才能讓管理層、研發自身體會到好處。
我看了不少版本管理軟件的對比,不管是擡Svn打Git或者反之,我以爲都對也都不對。由於不管管理或者技術,自己沒有對錯優劣,問題是場景。若是一個簡單穩定的後期維護項目,強推複雜的管理流程,效果不會好,由於沒有解決任何問題,只會引入問題。
管理的核心在於解決問題,而不是管理行爲自己。