--- tags: git, branch machanism --- # git branch 模式 https://mp.weixin.qq.com/s/9Ey04P5Xv4W95N2FEioZ1g ## introduction branch 的目的在於隔離 然而,每多一個分支(branch),代表要多維護一個分支情境 在這篇文章裡把,根據開發以及發布所在的特性,分為四種情況: 1 主幹開發 分支發布 2 主幹發布 分支開發 3 主幹開發 主幹發布 4 分支開發 分支發布 好的分支模式能有有效的增加 開發 集成 發布的效率 因此開發一個軟體專案時 選擇合適的分支模式 就是一個很重要的事情 ## 設想情境: Q1: 假設有一個軟體 只需要有一個版本 且只有一個開發者 適合哪一種分支模式? Q2: 假設有一個軟體 需要因應各種國家法規 開設多個版本 且有多位開發者同時開發 適合哪一種分支模式? ## 主流的幾種分支模式 ### 1 主幹開發模式(Trunk Base Development) 主幹開發 代表就是只有一個長期存在的開發branch 假設是 master 不允許其他開發分支長期存在 每次開發都要master 的source 來開發 開發驗證完立即merge 回 master 最後在從master merge 到 release branch 即使是要做bug修復 也是在 master修復 再cherry pick到 release branch ![trunk-base-develop-flow](https://mmbiz.qpic.cn/mmbiz_png/Z6bicxIx5naI1jwOfnA1w4PL2LhwNia76vKGDQuxygLzAW8ialkT8aGXgqcVJ1rnsHPRkBY8SeepsbqzNJStsENxg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 特點如下: 1 只有一個開發分支(master) 2 所有改動都發生在主幹分支 3 發布可以從主幹拉分支發布 4 主幹上進行的修复需要根据bug的修復策略,確定是否 cherry pick 到對應版本的發布分支。 ***Notice*** 為了讓主幹的代碼一直保持在可以work的狀態下,有幾個原則必須要遵守 1 每次的改動要盡量小 這樣驗證才能控制在某個範圍之內 2 要能夠快速的驗證,必須有完善的自動化驗證機制 3 因為團隊共享一個開發branch 因此每次commit都需要集成驗證 實際上開操作上 為了避免半成品影響整個 master branch 因此會需要在開發上使用feature Toggle的機制 然而 Feature Toggle類似於if else機制 一定程度會讓代碼變脆弱 Feature Toggle建立有良好的代碼架構上 才比較適合使用 ### 2 git-flow Git-flow 是為了解決多個feature並行開發所產生的分支模式 當要開發一個feature的時候 會先從主幹拉出一個feature branch 這時所有關於feature的改動都會在featrue branch 直到feature完成 才會從feature branch merge 回 develop branch 並且準備發布 Git-flow 會有以下幾種 branch: 1 feature branch: 為了開發某個feature 從 develop 分支出來的branch 2 release branch: 負責release版本的branch 3 develop branch: 負責集成所有feature branch 的branch, 未發布的最新feature branch 4 hotifx branch: 負責修復線上產品bug的branch 5 master branch: 保持最新已發布版本的 branch ![git-flow](https://mmbiz.qpic.cn/mmbiz_png/Z6bicxIx5naI1jwOfnA1w4PL2LhwNia76vk6dfL5mgia97bWjmXK9r6v3ricJNWUmN1R5Vrpy7yC5mibkWalPFearHA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 開發feature flow: 1 接到開發需求 從develop 分支出 feature branch 2 完成本地開發驗證,commit到feature branch 3 基於feature branch 進行驗證並且持續合併新的commit 4 完成需求的開發 並且feature branch 驗證成功, merge feature branch to develop branch 5 在develop 進行集成驗證 完成驗證的feature branch會被刪除 6 在develop 驗證成功需要發布的feature, 從develop拉出release branch進行發布 7 發布release branch , merge release branch into develop and master branch, delete release branch Hotfix flow: 1 發布之後,發現bug,從master拉出 hotfix branch 2 在hotfix 進行修正驗證 3 把問題修復merge到develop 跟 master 4 刪除hotfix 缺點: 1 分支特別多,每類分支都有特別用法 2 整個流程複雜需要團隊適度配合才能成功 3 feature branch如果太晚merge回 develop 將會造成 merge的解決conflict代價太高 4 develop branch的功能可以被master取代, 然而如果不需要develop ,那hotfix也可同樣是類似的概念 ### 3 github flow github flow 首先沒有所謂releaase branch 對於github flow來說 發布應該是持續進行 當一個版本準備好 就可以發布 而hotfix對於github flow來說也被當成某個feature branch Github flow 流程如下: 1 master branch上的code都應該是最新可部屬能運行的版本 2 如果開發新的功能,從master拉出一個新的feature branch, branch name以工作任務命名 3 盡可能commit code該featrue branch 4 開完驗證完該feature branch, 對master branch 發起 pull request 申請code review 5 通過code reiew後,把feature branch deploy到test environment 進行驗證 6 驗證成功, code reviewer approve pull request到master並且deploy 到production environment ![github-flow](https://mmbiz.qpic.cn/mmbiz_png/Z6bicxIx5naI1jwOfnA1w4PL2LhwNia76vju46DvJE0iaH3kWqxHw4elmlYgyqqROG2Pgs5fKHpb6Q7xR7O4f68BQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) Github-flow鄉對於git-flow簡單 如果持續部屬 就能夠快速的發現master branch問題 並且有revert機制 快速復原 然而需要持續部屬 所以必須把deploy過程簡化自動化 ### 4 gitlab flow Gitlab-flow類似於Github-flow 把pull request代換成merge request同樣是作為code reivew的方式 最大差別在於引入 production, pre-production的branch 這兩個branch用來區隔 production環境跟 pre-production環境的code ![gitlab-flow](https://mmbiz.qpic.cn/mmbiz_jpg/Z6bicxIx5naI1jwOfnA1w4PL2LhwNia76vy6D4libOBdUTMSe7jccGYKgsUAic3cgnC1lrgt3bicyQa9taj8dkJfRnw/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) Gitlab flow 流程如下: 1 master branch上的code都應該是最新可部屬能運行的版本 2 如果開發新的功能,從master拉出一個新的feature branch, branch name以工作任務命名 3 盡可能commit code該featrue branch 4 開完驗證完該feature branch, 對master branch 發起 merge request 申請code review 5 通過code reiew後,把feature branch deploy到test environment 進行驗證 6 驗證成功, code reviewer approve merge request到master並且deploy 到pre-production environment 7 pre-proudction運行成功 把pre-production merge到 production ## 優缺點分析 1 主幹開發模式 是主幹開發,可以是主幹發布也可以是分支發布 2 Git-Flow 是分支開發 分支發布 3 Github-Flow 是分支開發 主幹發布 4 Gitlab-Flow 分支開發,可以是主幹發布也可以是分支發布 ![](https://mmbiz.qpic.cn/mmbiz_png/Z6bicxIx5naKvveUbbe72esKOaNWXNIbqvuo3ALYLqLRM2QsjUupyrjmIpeKkpWyAuoH2kAX7yT1PysowkHEF3g/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) ## 選擇合適的模式 ![](https://mmbiz.qpic.cn/mmbiz_png/Z6bicxIx5naKvveUbbe72esKOaNWXNIbqTR2PtYZ5Nalwb9UxtKMhqNW1BHvsHwRRGibZUicnUjVoc3yHB9GwKO0g/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1) 如果常見的這幾種分支模式都沒有符合團隊需求的 那也可以自己因應需求 設計出適合的flow給團隊使用