學委最近又開發了一個專案,后面會說,
這次學委講講開源專案的分支管理,幫助讀者了解開源專案是怎么管理代碼的,
多數開源專案都是main(以前是master/trunk)分支管理代碼的,
開發版本或者中間修訂版本走feature 分支發布,然后再定期合并到master 分支,
分支管理是什么
分支管理,簡單理解,就是多條生產線管理,比如一款手機的多個版本的生產,
比如某個手機的三條生產線:
現售的Mate30手機,在裝訂生產,
同時還有Mate20舊版本還有部分銷售訂單還在繼續裝訂,
新版本Mate40還在研發
這樣就好理解,我們的專案代碼就是制作手機的輸入,通過管理多個分支,讓不同產品線團隊做到最大程度的獨立開發,發布不同款式產品,
下面介紹一下著名開源專案和我們做開源專案應該怎么進行分支管理的
第一種 基于主干分支管理(Trunk Based)比如LINUX內核
我們打開Linux內核的主線repo,看到如下的分支,只有master主干分支,

非常簡單,也比較典型的主干為中心的分支管理,
因為linux內核主線只有一個,新的特性代碼會被不斷提交到主線,新內核也沒有必要支持向后移植,
如果需要得用指定的tag來檢出特定版本分支,進行修訂發行,
就像下圖一樣,以trunk分支為中心,每一個彎都是一個PR(Pull Request),合并到trunk分支,

學委補充一下PR,PR代表每次有效開發作業的提交與合并,
主干分支管理的好壞:
好處:簡化管理,所有特性只要審核通過馬上合并到主干分支,這樣隨時可以發布,也避免了出現大規模集成的風險,
缺點:一個個單一的提交造成問題不大,不過當出現顛覆式的提交或者多個提交,這些提交造成的問題會一直影響主干分支,也影響到每次發布,直到問題解決,
小伙伴可能有疑問了,那么穩定發行版本,如何進行打補丁(比如遇到bug或者安全漏洞需要提交修改)
穩定版本倉庫:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
linux還有一個獨立的stable 倉庫,它基于主線分支的一次鏡像(或者定期同步,主要是發行大版本的時候),
確定了發行的主版本后,做一個分支發布為stable倉庫,后續比較急的補丁都打在stable分支上,然后再回顧這些提交,發布到內核倉庫的主干分支,
第二種 Gitflow模式,即多特性分支管理, 比如hadoop
大資料的底層hadoop框架是怎么發行的?
我們看看下圖,這就一目了然了,

一個trunk主干分支,加上現行的主流版本的特性分支(branch-2.10, branch-3.2等),
別看有trunk分支就是咬定了是trunk-based開發模式,我們要看這個產品活躍分支,
hadoop框架誕生很早,應用比較廣泛,屬于應用型上層框架,
很多企業用的版本都不是統一個的3.X新版本,不少企業還是2.X版本,所以hadoop社區采用這種分支管理模式,長期維護了多個主流版本的開發,這點學委覺得是非常合適的,
就像下圖一樣,每一個彎都是一個PR(Pull Request):

學委想指出,這里出現了多個長分支,像feature1.x, feature
2.x(當然hadoop現在不維護1.x版本了),這個圖只是展示作用,
這樣的好處:
各個分支的開發獨立運作,hadoop 2.X專案主要還是基于Java7運行環境執行,而hadoop 3.X 跟Java8運行,
這樣提高了不同分支的獨立行,兼顧發行效率,畢竟java7跟java8有不少區別的,
壞處最關鍵的就是:合并的風險!
隨著時間發展,這些大分支積累的patch和主干分支積累的新開發特性,總需要一個時間合并起來,這時候需要很多作業進行合并校對應對一個相對大的工程,
這些大量代碼合并往往需要配套不止集成測驗,還有回歸測驗,(當然主干分支需要這套,但是主干分支可以保存每天測完,這個是多分支管理無法比擬的)
延伸 - 自己的專案該如何選擇?
非常簡單,如果是個人開發者,直接走TBD(Trunk Based Development),比較簡單,隨時可以打一個tag,發布一個版本,
如果是一個百人團隊,那么學委建議根據實際考慮了,
-
統一業務平臺(二開或者傳統大型平臺)多團隊多專案開發,建議走Git Flow(feature branch模式)多分支模式開發,保證各個專案團隊的獨立性,同時縮短定期合并的周期,
-
微服務多組件的單個平臺,可以走TBD,劃分業務的服務單元保證多個業務單元獨立開發,同時分化一個核心平臺組管理開發平級別需求,
思考的核心,是把平臺規劃好,讓它支持TBD模式,避免出現大規模合并,除了開發測驗成本,這個需要很大量管理介入協調!
文章都在這些專欄里面,喜歡Python的朋友,請關注學習 十年老將帶你做開源專案 or Python基礎專欄 or Python入門到精通大專欄
持續學習持續開發,我是雷學委!
編程很有趣,關鍵是把技術搞透徹講明白,
創作不易,請關注收藏點贊,或者留下評論打打氣!
參考鏈接:
Linux內核Repo: https://github.com/torvalds/linux
Linux穩定版Repo:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/
Hadoop代碼倉庫:https://github.com/apache/hadoop/branches
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/302465.html
標籤:其他
