簡介
Gitflow工作流定義了一個圍繞項目發(fā)布的嚴格分支模型棚放,它不同的分支分配一個很明確的角色壹置,并定義分支之間如何和什么時候進行交互科汗。
Gitflow工作流仍然用遠程倉庫作為所有開發(fā)者的交互中心脐嫂。和其它的工作流一樣晃酒,開發(fā)者在本地工作并push分支到要中央倉庫中澳叉。
Gitflow工作流應被視作為指導方針隙咸,而非“鐵律”。你可以組合使用不同的流程成洗,找到適合自己項目的工作流五督。
主要分支介紹
- master分支:主分支,產品的功能全部實現(xiàn)后瓶殃,最終在master分支對外發(fā)布充包,長存分支。
- develop分支:開發(fā)分支遥椿,基于master分支克隆基矮,產品的編碼工作在此分支進行,長存分支冠场。
- release分支:測試分支家浇,基于delevop分支克隆,產品編碼工作完成后碴裙,發(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流程如何被用來管理一次產品發(fā)布粪般。假設你已經創(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ā)工作已完成螃概,需要為產品發(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關鍵字" /* 提交到本地倉庫*/
(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到遠程倉庫 */