前一篇介紹了 git相關的概念,我們可以檢視檔案的狀態,在各個狀態之間進行切換,可以建立和合並分支,通過rebase還可以整理自己的提交歷史。通過這些命令和操作,就可完成工作流規範規定的操作流程了。
本篇介紹具體的規範,包括分支的劃分和命名規範,不同型別的分支應對不同的場景,然後會介紹下工作流工具git-flow,如何簡化我們的操作。
分支構成
master和develop分支一直存在,且名稱不會變化,一般不直接修改這2個分支,由其他分支合併而來。
feature、release、hotfix分別用於功能點開發、優化,特定版本測試,線上問題緊急處理,同一型別的分支會產生多個。
分支劃分如下:
- master:與線上版本保持絕對一致;
- develop:開發分支,由下文提到的release、feature、hotfix分支合併過後的程式碼;
- feature:實際功能點開發分支,建議每個功能新建一個feature, 具有關聯關係的功能公用一個feature分支;
- release:每一次開發完成之後,從develop建立出來的分支,以此分支為基準,進行測試;
- hotfix:該分支主要用於修復線上bug;
命名規範約定如下:
- feature分支命名:feature/name
- release分支命名:release/name
- hotfix分支命名:hotfix/name
比如有一個「優化分散式Session」的需求,可在develop分支的基礎上建立新分支 feature/optimize_distributed_session進行開發,開發完成後合併到develop分支。
分支詳細介紹和處理流程
master分支
主分支,與線上執行的版本始終保持一致,任何時候都不要直接修改master分支。
一個版本的release分支、hotfix分支開發完成後,會合並程式碼到master分支,也就是說master分支主要來源於release分支和hotfix分支。
develop分支
開發分支,始終保持最新完成以及bug修復後的程式碼,新增功能時基於該分支建立feature分支。
一個版本的release分支、hotfix分支開發完成後,也會合併到develop分支,另外,一個版本的feature功能開發完成後,也會合併到develop分支。也就是說develop分支來源於feature、release、hotfix分支。
feature分支
開發新功能或優化現有功能時,會建立feature分支,以develop為基礎建立。一般會有多個功能同時開發,但上線時間可能不同,在適當的時候將特定的feature分支合併到develop分支,並建立release分支,進入測試狀態。
release分支
當一組feature開發完成,會首先合併到develop分支,開始進入提測階段時,會建立release分支。
以release分支程式碼為基準提測,測試過程中若存在bug需要修復,則直接由開發者在release分支修復並提交。
測試完成之後,合併release分支到master和develop分支,此時master為最新程式碼,用作上線。
hotfix分支
線上出現緊急問題時,需要及時修復,以master分支為基線,建立hotfix分支,修復完成後,需要合併到master分支和develop分支。
特殊情況處理和注意點
develop分支已存在未上線的feature程式碼, 此時需要緊急上線一個新功能, 但develop的程式碼不能上,如何處理 ?
- 以master為基線建立feature, 在完成之後,程式碼合併到master分支;
- 為了保證develop是最新程式碼,需要從master合併到develop分支;
以develop為基線,建立了f1和f2兩個feature分支之後, f1,f2開發一半的時候,發現兩個分支程式碼需要有依賴怎麼辦 ?
- 最好在開發開始前確定兩個功能是否相關,若相關則只建立一個分支,兩個功能在一起開發;
- 如果已經建立,則需要合併到一個分支;
一定要保證commit歷史記錄的整潔,程式碼合併時,根據情況選擇merge或rebase;
使用rebase注意,一旦分支中的提交物件釋出到公共倉庫,就千萬不要對該分支進行衍合操作;
提交說明規範:
- 提交說明最好限制在一行以內,50個字元以下,簡明扼要地描述更新內容,空開一行後,再展開詳細註解;
- 如果關聯jira,寫上jira地址;
git-flow工具
上面的流程在第一次接觸時,會覺得有點複雜,通過git-flow工具可以把這些流程自動化。它是一個命令列工具,支援各個平臺,比如OSX、Linux、Windows等支援。
初始化
通過 git flow init 命令進行初始化,以互動式的方式進行,主要是約定分支的命名,建議使用預設值;
開發新功能
git flow feature start f1 新增新特性,這個操作建立了一個基於develop的特性分支,並切換到這個分支之下。
git flow feature finish f1 完成新特性,這個操作會合並f1分支到develop分支,並刪除特性分支,切換回develop分支。
git flow feature publish f1 釋出新分支,釋出新特性分支到遠端伺服器,其它使用者也可以使用這分支。
釋出版本
git flow release start r1 [BASE] 建立釋出版本,[BASE]是以哪個分支或commit為基礎進行發版,一般為develop。
git flow release publish r1 釋出release分支,其他同事就可以看到這個分支,並修改一些小問題。
git flow release finish r1 完成release分支,會合並release分支到master分支,用release分支名打Tag,合併release分支到 develop分支,最後移除release分支。
修復線上問題
有可能需要修正 master 分支上某個 TAG 標記的生產版本。
git flow hotfix start VERSION [BASENAME] 建立hotfix分支,VERSION 引數標記著修正版本,[BASENAME]為finish release時填寫的版本號。
git flow hotfix finish VERSION,當完成緊急修復分支,程式碼合併到develop和 master分支。相應地,master分支打上修正版本的 TAG。