簡介
Gitflow工作流定義了一個圍繞項目發(fā)布的嚴格分支模型,它不同的分支分配一個很明確的角色,并定義分支之間如何和什么時候進行交互。
Gitflow工作流仍然用遠程倉庫作為所有開發(fā)者的交互中心。和其它的工作流一樣,開發(fā)者在本地工作并push分支到要中央倉庫中。
Gitflow工作流應被視作為指導方針,而非“鐵律”。你可以組合使用不同的流程,找到適合自己項目的工作流。
主要分支介紹

- master分支:主分支,產(chǎn)品的功能全部實現(xiàn)后,最終在master分支對外發(fā)布,長存分支。
- develop分支:開發(fā)分支,基于master分支克隆,產(chǎn)品的編碼工作在此分支進行,長存分支。
- release分支:測試分支,基于delevop分支克隆,產(chǎn)品編碼工作完成后,發(fā)布到本分支測試,測試過程中發(fā)現(xiàn)的小bug直接在本分支進行修復,修復完成后合并到develop分支。本分支屬于臨時分支,目的實現(xiàn)后可刪除分支。
- hotfix分支:bug修復分支,基于master分支或里程碑tag克隆,主要用于修復對外發(fā)布的分支,收到客戶的bug反饋后,在此分支進行修復,修復完畢后分別合并到develop分支和master分支。本分支屬于臨時分支,目的實現(xiàn)后可刪除分支。
- feature分支:功能特征分支,基于develop分支克隆,主要用于多人協(xié)助開發(fā)場景或探索性功能驗證場景,功能開發(fā)完畢后合并到develop分支。feature分支可創(chuàng)建多個,屬于臨時分支,目的實現(xiàn)后可刪除分支。
示例
下面的例子將演示gitflow流程如何被用來管理一次產(chǎn)品發(fā)布。假設你已經(jīng)創(chuàng)建好了一個遠程倉庫。
(1)基于master分支,創(chuàng)建develop分支

git checkout -b develop /* 基于master分支建立develop分支,并切換到develop分支 */
git push -u origin develop /* 推送develop分支到遠程倉庫 */
(2)其他開發(fā)者應該clone遠程倉庫,并且為develop創(chuàng)建一個追蹤分支。
git clone https://github.com/haishancheng/gitTest.git /* clone遠程倉庫 */
git checkout -b develop origin/develop /* 基于遠程倉庫的develop分支建立本地的develop分支進行開發(fā) */
(3)完成部署,進入開發(fā)
到現(xiàn)在,所有人都把包含有完整歷史的分支(develop)在本地配置好了。此時所有人都可以進行開發(fā)了。假設工程師A和工程師B開始開發(fā)新功能。他們需要為各自的功能創(chuàng)建相應的分支。新分支不是基于master分支,而是應該基于develop分支。然后他們各自在自己的功能開發(fā)分支上開展工作。通常就是這種git三部曲:edit,stage,commit。

git checkout -b feature-xxx develop /* 基于develop分支建立各自的feature分支,并切換到feature分支 */
…coding中… /* 代碼編寫中*/
git add **.** /* 提交修改到暫存區(qū)*/
git commit -m "提交注釋" /* 提交到本地倉庫*/
(4)功能開發(fā)完畢
工程師A的功能開發(fā)完畢了,他需要所完成的功能合并入develop分支,并推送到遠程倉庫

git checkout develop /* 切換到develop分支 */
git pull origin develop /* 執(zhí)行代碼拉取操作,防止代碼沖突 */
git merge feature-xxx /* 將完成的功能分支合并入develop分支*/
git push origin develop /* 推送到遠程倉庫 */
git branch -d feature-xxx /* 刪掉功能分支*/
(5)進行測試并且修復bug
工程師A階段性的開發(fā)工作已完成,需要為產(chǎn)品發(fā)布的準備工作。啟動測試工作,將代碼發(fā)布到測試分支release,并推向遠程倉庫。測試工程師提交Bug后,開發(fā)人員在release分支上修復bug。

git checkout -b release /* 基于develop分支建立release分支,并切換到release分支 */
git push origin release /* 將release分支推送到遠程release分支 */
…解決bug coding中… /* 解決bug中 */
git add **.** /* 提交修改到暫存區(qū)*/
git commit -m "修復說明中最好添加Bug#BugID關(guān)鍵字" /* 提交到本地倉庫*/
(6)修完bug,合回master和develop分支
bug修復完畢之后,工程師A就要把修復完的測試分支合并入master和develop,然后再將測試分支刪除。

git checkout master /* 切換到master分支 */
git merge release /* 合并release分支到master分支 */
git push origin master /* 推送master分支到遠程倉庫master分支 */
git checkout develop /* 切換到develop分支 */
git merge release /* 合并release分支到master分支 */
git push origin develop /* 推送develop分支到遠程倉庫develop分支 */
git branch -d release /* 刪掉本地release分支 */
git push origin --delete release /* 刪掉遠程倉庫的release分支 */
(7)打tag標簽
打一個里程碑tag標簽,并推送到遠程倉庫,就可以發(fā)布了
git checkout master /* 切換到master分支 */
git tag -m "task#003v1.0.0首版發(fā)布" v1.0.0.181018 /* 創(chuàng)建里程碑tag */
git push origin v1.0.0.181018 /* 推送里程碑tag到遠程倉庫 */
(8)線上bug修復
-
用戶發(fā)現(xiàn)了一個bug,基于master(或tag)創(chuàng)建了一個用于維護的分支(hotfix分支),修復完畢之后合入master合develop分支
image
git checkout-b hotfix-v1.0.0.181018 v1.0.0.181018 /* 基于tag創(chuàng)建hotfix分支*/
… fix the bug… /* 修復bug*/
git checkout master /* 切換到master分支 */
git merge hotfix-v1.0.0.181018 /* 合并hotfix分支到master分支 */
git push origin master /* 推送master分支到遠程倉庫master分支 */
git checkout develop /* 切換到develop分支 */
git merge hotfix-v1.0.0.181018 /* 合并hotfix分支到master分支 */
git push origin develop /* 推送develop分支到遠程倉庫develop分支 */
git branch -d hotfix-v1.0.0.181018 /* 刪掉本地hotfix分支 */
git push origin --delete hotfix-v1.0.0.181018 /* 刪掉遠程倉庫的hotfix分支 */
- 打一個新的里程碑tag標簽,并推送到遠程
git checkout master /* 切換到master分支 */
git tag -m "Bug#002修復某某Bug" v1.0.1.181019 /* 創(chuàng)建里程碑tag */
git push origin v1.0.1.181019 /* 推送里程碑tag到遠程倉庫 */
