閱讀原文:github.com/ruizhengyun…html
雖然經歷過 svn 年代,工做流程中也用到了 svn,但更多時候仍是在用 git,相信不少開發小夥伴也在用 git 吧,市場上已經有不少關於 git 知識介紹了,那爲何我還要寫一本線上小書呢?坦白說寫下來是爲了手過把癮、這個過程對 git 知識也有了個系統性認知,若是能幫到讀者一二,那最好不過了。git
和別的小書稍稍有個出入,不在給 Git 給予太多文字的簡介,由於你確定多少知道它是什麼東西。github
其實很簡單,就是來源功能驅動開發(Feature-driven developer,簡稱 FDD),協做開發就得有版本管理,管理的天然就是分支了。編程
功能驅動開發就是:需求來了,如果功能,則創建功能分支(feature branch);如果 bug,則創建補丁分支(hotfix branch)。完成開發後,該分支就合併到相應主分支,而後刪除,版本發佈後記得打上 git 標籤。svn
Git 做爲一個源碼管理系統,多人協做才能看到其價值。這和 github 社會化編程相互輝映,成就彼此。既然協做,就得有一個規範化的工做流程,讓你們有效地合做,使得項目層次分明地發展下去。工做流程能夠稱爲 "workflow" 或"flow",即水流,比喻項目像水流那樣,順暢、天然地向前流動。工具
對於工做流程方式,經常使用 3 種方式測試
這個工做流是 Vincent Driessen 2010 年發佈出來的分支管理模型,熱度很是高,我安利的也是這個,公司管理項目也是這麼玩的。優化
分支 | 分支名稱 | 生命週期 | 描述 |
---|---|---|---|
Master | 主分支 | 長期 | 從這個分支上檢出的都是穩定的發佈版,版本發佈後記得打上 git 標籤。好處是,在測試的時候,不影響下一個版本功能並行開發 |
Hotfix | 修復分支 | 暫時 | 用於線上緊急 bug 修復,修復後,合併回 Master 和 Develop,而後刪除分支 |
Release | 預發分支 | 暫時 | 版本提測後,刪除 Feature,發現 bug,從 Develop 檢出 Release 分支,修改後提交,測試發佈後,合併到 Master 和 Develop,而後刪除分支 |
Develop | 開發分支 | 長期 | 用於平常開發,存放最新的開發版,完成一個版本合併到這裏 |
Feature | 功能分支 | 暫時 | 用來作分模塊功能開發,本次版本有 5 我的開發就建 5 個分支,完成後合併到 Develop |
總結下ui
即合併分支,這個階段加上參數 no-ff
,即策略合併,這這種方式會多以合併提交,好處是保證一個很是清楚的提交歷史,能夠看到被合併分支的存在,我想這也是分支存在的一塊兒所在。相反,不要選擇默認合併方式 Fast-Forword
。spa
怎麼樣,上面流程配色是否很舒服和分支流向是否很清晰?
雖然 Git Flow 解決了項目管理的分支管理,但實際使用過程當中,仍是有一些問題:
最簡單的一種工做流程方式,開源項目就是採用這種方式,含Master + Feature(含 Hotfix)。
protected
分支保護,只有有權限的人才能推送代碼到 Master;在我看來,Github flow 最大特點就是 PR,這是一個偉大的發明,除了分支合併功能,還有
平常開發中,會用到第三方庫。使用過程當中,出現了問題,第一個反應是去這個第三方庫的 GitHub 倉庫去搜索一下 issue ,看沒有人遇到過,項目維護者修復了沒有,通常未解決的 issue 是 open 狀態,已解決的會被標記爲 closed。這就是問題追蹤 issue tracking(issue 解決效率也是選用第三方庫的一個標準)。
若是你第三方庫(開源項目)的維護者,除了標記 issue 的狀態(open 和 closed),還能夠給它標記上不一樣的標籤,來優化項目。當提交的時候,若是提交信息中有 fix #1 等字段,能夠自動關閉對應編號的 issue。
不得不說問題追蹤很是適合開源項目。Github 社區使用的就是這個工做流模型,能夠建個項目耍耍,拉進直男間的距離,哈哈。
GitHub Flow 是簡化了 Git Flow,就一個長期分支 Master,同時提供了圖形界面工具,必定程度上避免了一些問題,但仍是有一些實際問題:
年輕的工做流模式。它是 GitLab 的 CEO Sytse Sijbrandij 在 2014 年 9月 29 正式發佈出來的。由於後出現的,因此站在巨人的肩膀上,集兩種方式之長,補其之短。既有適應不一樣開發環境的彈性(分支策略),又有單一主分支的簡單和便利(PR 和 issue tracking)。
一個 Master 分支不夠,那就添加了一個分支 Prodution,專門用來發布版本。
在 Master 分支以外,再建兩個環境分支:
分支 | 環境分支 | 上下游 |
---|---|---|
Master | 開發分支 | 功能分支是開發分支的"上游" |
Pre-production | 預發分支 | 開發分支是預發分支的"上游" |
Production | 生產分支 | 預發分支又是生產分支的"上游" |
Feature -> Master -> Pre-production -> Production
複製代碼
若代碼的變化,必須由"上游"向"下游"發展,即合併順序,按環境依次推送,確保代碼測試過,從上游分支合併到下游分支。緊急狀況下,才容許跳過上游,直接合併到下游分支,即 upstream first,上游優先。
對外發布版本的記錄是很是重要的。線上出現了一個問題,須要拿到問題出現對應版本的代碼,才能準肯定位問題。在 Git Flow,版本記錄是經過 Master 上的 Tag 來記錄。發現問題,建立 Hotfix 分支,完成以後合併到 Master 和 Develop。
在 GitLab Flow ,建議的作法是每個穩定版本,都要從 Master 分支拉出一個分支,好比 0-1-0-stable、0-2-0-stable 等等。發現問題,就從對應版本分支建立修復分支,完成以後,先合併到 Master。若此時還有預發佈分支,還要合併到 Release 分支,遵循 「上游優先」 原則。
功能分支合併進 Master 分支,必須經過 Pull Request(Gitlab 是 Merge Request)。PR 本質是一種對話機制,提交的時候,@相關人員或團隊,引發他們的注意。
Master 分支應該受到保護,不是每一個人均可以修改這個分支,以及擁有審批 PR 的權力。Github 和 Gitlab 都提供"保護分支"(Protected branch)這個功能。
文中提了 Git 有兩種合併方式
--no-ff
參數;