Simple Gitflow
業(yè)務(wù)越來(lái)越復(fù)雜,分支也越來(lái)越多,為提高效率和規(guī)避流程錯(cuò)誤,商定一個(gè)統(tǒng)一的工作流程是至關(guān)重要的。
先上圖~

分支
Master
它是一個(gè)長(zhǎng)期分支,存在于整個(gè)項(xiàng)目周期。
master分支上不允許任何代碼提交,只能由負(fù)責(zé)人進(jìn)行分支合并。該分支存放的應(yīng)該是隨時(shí)可供在生產(chǎn)環(huán)境中部署的代碼。
Feature
-
臨時(shí)分支,用于開發(fā)新功能,不同業(yè)務(wù)可創(chuàng)建多個(gè)
feature分支。 - 從
master分支創(chuàng)建,開發(fā)測(cè)試完成,合并至release分支后刪除。
Release
- 臨時(shí)分支,用于預(yù)發(fā)布或回歸測(cè)試。
- 從
master分支創(chuàng)建,發(fā)布后打tag合并至master后刪除。 - 命名建議:release/1.x.x
Hotfix
- 臨時(shí)分支,用于修復(fù)線上問(wèn)題。
- 從
master分支創(chuàng)建,發(fā)布后打tag合并至master后刪除。 - 命名建議:hotfix/bugName
為什么沒(méi)有develop分支?
develop分支的職責(zé)已經(jīng)分配到了feature和hotfix分支,這樣臨時(shí)分支的修改也不用同步到兩個(gè)分支(develop和master),為避免混淆,所以移除了develop分支。
場(chǎng)景1:多個(gè)feature并行開發(fā)
假設(shè)5月收到需求,我們要做群密聊,計(jì)劃6月上線,并且在群密聊上線前,有個(gè)0528優(yōu)化版本要上。
好了,場(chǎng)景有了,來(lái)看看具體流程怎么操作。
- 創(chuàng)建feature分支
從master分支分別創(chuàng)建feature/groupSChat、feature/me0528,命名最好貼合業(yè)務(wù)。
git checkout master
git branch feature/groupSChat
git branch feature/me0528
分支建好后,就進(jìn)入開發(fā)和測(cè)試階段;在經(jīng)歷N次提交和測(cè)試后準(zhǔn)備上線。
- 創(chuàng)建release分支
假設(shè)5月份版本是5.5.5 ,從master分支創(chuàng)建release/5.5.5分支,然后合并feature/me0528分支。
// 從master分支創(chuàng)建release/5.5.5分支并切換到該分支
git checkout master
git checkout -b release/5.5.5
git merge feature/me0528
git branch -d feature/me0528
- 打包上線-5.5.5版本
在release/5.5.5分支進(jìn)行最終測(cè)試后上線,我們打上tag并合并到master,然后刪除release/5.5.5分支。
git checkout master
git merge release/5.5.5
git tag v5.5.5
git branch -d release/5.5.5
注意,到現(xiàn)在雖然5.5.5版本上線了,隔壁分支feature/groupSChat還在緊張開發(fā)中,但它絲毫沒(méi)有受到影響。
- 群密聊feature,在經(jīng)過(guò)N次提交和測(cè)試后,準(zhǔn)備上線
假設(shè)群密聊版本是6.0.0,從master分支創(chuàng)建release/6.0.0分支,然后合并feature/groupSChat分支。
git checkout master
git checkout -b release/6.0.0
git merge feature/groupSChat
git branch -d feature/groupSChat
- 打包上線-6.0.0版本
在release/6.0.0分支進(jìn)行最終測(cè)試后上線,我們打上tag并合并到master,然后刪除release/6.0.0分支。
git checkout master
git merge release/6.0.0
git tag v6.0.0
git branch -d release/6.0.0
到這里,我們并行開發(fā)的兩個(gè)feature都上線了;開發(fā)過(guò)程中我們創(chuàng)建的feature、release等分支,也隨發(fā)版后刪除了,倉(cāng)庫(kù)里只是多了兩個(gè)tag標(biāo)簽。
場(chǎng)景2:緊急修復(fù)線上bug
假設(shè)在場(chǎng)景1中,剛開始做feature/me0528和feature/groupSChat功能不久,就發(fā)現(xiàn)線上版本有嚴(yán)重問(wèn)題,領(lǐng)導(dǎo)要求馬上修復(fù)后上線。這時(shí)你可能會(huì)想,我已經(jīng)有兩個(gè)分支在開發(fā)了,該咋辦呢?別擔(dān)心,你還有master分支,它存放著可供在生產(chǎn)環(huán)境中部署的代碼。
- 創(chuàng)建hotfix分支
假設(shè)這個(gè)嚴(yán)重問(wèn)題是導(dǎo)致通訊錄用不了,contact not work ?
git checkout master
git branch hotfix/contactNotWork
- 打包上線-5.5.1版本
git checkout master
git merge hotfix/contactNotWork
git tag v5.5.1
git branch -d hotfix/contactNotWork
- 首先,這里假設(shè)線上版本為5.5.0,bug修復(fù)后發(fā)版為5.5.1
- 與feature分支不同的是,hotfix分支的代碼基于穩(wěn)定的功能,測(cè)試完畢后不需要通過(guò)release分支即可發(fā)布上線。
小結(jié)
- 除了master分支,其它都是臨時(shí)分支,倉(cāng)庫(kù)中只有master分支和正在開發(fā)的feature分支,便于維護(hù)。
- 臨時(shí)分支都是從master分支創(chuàng)建的。
- feature分支通過(guò)測(cè)試后才創(chuàng)建并合并到release分支。
- 通過(guò)創(chuàng)建release分支,能有效避免丟失已上線的功能或bug修復(fù)代碼。
- 場(chǎng)景中分支合并示例使用的
git merge,當(dāng)然你也可以用git rebase,關(guān)于二者的區(qū)別可參考文末鏈接。
Thanks
關(guān)于本文的由來(lái),首先要感謝 騏彰同學(xué)提供的思路,和現(xiàn)有團(tuán)隊(duì)的支持,才促使我整理了這篇文章,感謝。