就像代碼需要代碼規(guī)范一樣,代碼管理同樣需要一個清晰的流程和規(guī)范
Vincent Driessen 同學(xué)為了解決這個問題提出了 A Successful Git Branching Model

上面的圖看著挺復(fù)雜的, 抽象出來的概念就是:
5個分支
項目里有2個永久分支:master和develop, 3個短期分支: feature, hotfix和release.
-
永久分支
- master分支
- develop分支
-
短期分支
- feature分支, 功能開發(fā)分支, 派生于develop, 合并回develop
- hotfix分支, bug修復(fù)分支, 派生于master, 合并回master和develop
- release分支, 版本發(fā)布分支, 派生于develop, 合并回master和develop
未來所有的開發(fā)工作都圍繞這兩個永久分支來進(jìn)行: 從永久分支派生短期分支->合并回永久分支.
派生和合并的時機(jī)、源分支、目標(biāo)分支跟具體的開發(fā)類型有關(guān),Gitflow里有明確的規(guī)則.
短期分支,針對他們的工作內(nèi)容完成后,一般都要進(jìn)行刪除.
工作內(nèi)容完成的定義是個:開發(fā)完成, 合并完成, 缺一不可.
- master
又稱為production(生產(chǎn)環(huán)境)分支, jenkins根據(jù)tag來拉取這個分支的代碼來打包, 這個分支只能從其他分支合并,不能在這個分支直接修改. 所有在master分支上的commit應(yīng)該打tag.
- develop
這個分支是我們是我們的主開發(fā)分支, 包含所有要發(fā)布到下一個release的代碼, 這個主要合并于其他分支, 比如feature分支.
- feature
這個分支主要是用來開發(fā)一個新的功能, 一旦開發(fā)完成, 我們合并回develop分支.
分支名為feature/*, 舉例:登錄功能命名為 feature/login
feature分支從develop派生而來, 開發(fā)完成后合并回develop. 一般這時會刪除這個feature分支.
可以有多個feature分支同時存在.
- release
當(dāng)你需要一個發(fā)布一個新release的時候, 我們基于develop分支創(chuàng)建一個release分支, 我們可以在這個release分支上測試, 修改Bug(但是不要加新功能, 也不要從develop分支上合并新的改動到這個release分支), 完成這個release分支后, 我們合并到master和develop分支, 同時在master分支上打個tag記住release版本號, 然后刪除這個release分支.
- hotfix
當(dāng)我們在線上發(fā)現(xiàn)一個需要緊急修復(fù)的bug時候, 我們需要從master分支派生一個hotfix, 完成hotfix后, 我們合并回master和develop分支, 所以hotfix的改動會進(jìn)入下一個release, 同時要在master上打一個tag.
實踐git-flow的方式
- 安裝git-flow命令行工具,
brew install git-flow, 通過命令行來操作, 比較難記. - 安裝sourcetree客戶端, 通過gui來操作(我們團(tuán)隊默認(rèn)做法)
sourcetree的git-flow實踐
初始化操作
sourcetree系統(tǒng)頂部欄->倉庫->git-flow或hg flow->初始化倉庫->確定(使用默認(rèn)命名)
本地自動增加了一個develop的分支, 加上gitlab倉庫默認(rèn)就會自動有的master分支. 把這兩個分支推送到遠(yuǎn)端倉庫, 兩個永久分支創(chuàng)建完成了.
開發(fā)新功能
sourcetree系統(tǒng)頂部欄->倉庫->git-flow或hg flow->建立新的功能
功能名稱填入英文, 比如login, 點確定.
sourcetree做了以下工作: 基于develop分支派生了feature/login分支, 本地切換到這個分支, 并推送到origin(遠(yuǎn)端).
完成功能
sourcetree系統(tǒng)頂部欄->倉庫->git-flow或hg flow-完成功能
在下拉框中選擇對應(yīng)的login功能. 點確定
sourcetree做了以下工作: 在本地把feature/login分支合并到develop分支, 然后刪除了本地feature/login, 切換到本地的develop分支.
然后在sourcetree上點擊推送按鈕, 推到origin(遠(yuǎn)端).
準(zhǔn)備發(fā)布
sourcetree系統(tǒng)頂部欄->倉庫->git-flow或hg flow-建立新的發(fā)布版本
在發(fā)布版本號里輸入 v1.0 , 點確定
sourcetree做了以下工作: 本地基于deveoper分支派生了release/v1.0分支, 本地切換到了這個分支.
然后在sourcetree上點擊推送按鈕, 推到origin(遠(yuǎn)端), 為了jenkins拉代碼用.
這個分支是為了上線做準(zhǔn)備的, 也是測試的對象, 我們可以用jenkins拉取它的代碼來出開發(fā)環(huán)境的包, 然后在這個分支上面修復(fù)bug(但別加新的feature).
完成發(fā)布
sourcetree系統(tǒng)頂部欄->倉庫->git-flow或hg flow-完成發(fā)布版本
在下拉框中選擇對應(yīng)的v1.0, 勾選刪除分支和推送變更到遠(yuǎn)程, 點確定
sourcetree做了以下工作: 本地合并release/v1.0分支到develop分支和master分支, 本地刪除了release/v1.0分支, 給master打了tag 'v1.0',
引用文章
A Successful Git Branching Model (git-flow提出者blog)