<1> Git flow是git的一個擴展集,它基于Vincent Driessen 的分支模型,文章“A successful Git branching model”對這一分支模型進行了描述,其示意圖如下:
git flow分支模型
上圖從左往右看,分別為
時間軸,從上往下時間在流逝
feature分支(玫紅),圖上有兩個feature分支,在這個分支上,進行功能特性的開發
develop分支(黃色),git flow的主分支,feature分支和release分支都會將代碼合并到此分支上
release分支(綠色),總是基于develop分支創建,最后合并到develop分支和master分支
hotfix分支(紅色),總是基于master分支創建,最后合并到master分支和develop分支
master分支(藍色),git flow的主分支,在開發的整個階段一直存在,平時不在此分支開發,因此代碼比較穩定,可以用來發布
<2> Git flow的源碼可以通過以下鏈接下載:
或者,直接輸入以下命令安裝git flow:
apt-get install git-flow
在Windows平臺下安裝git flow,可以參考《Windows環境下msysgit安裝git flow》。
我們可以通過以下命令來初始化一個現有的git本地倉庫。
git flow init
接著回答幾個關于分支的問題。不用擔心,使用默認值即可,直接按回車鍵。
No branches exist yet. Base branches must be created now
Branch name for production releases: [master]
Branch name for “next release” development: [develop]
How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
這樣,便完成了git flow的初始化工作。
<3> 在git flow 的分支模型中,有兩個主分支master和develop,還有幾個額外的分支來支持代碼的版本管理。下面先簡要介紹一下這些分支的特點和git flow常用命令的使用。
- ①. Master
master分支只有一個。
master分支上的代碼總是穩定的,隨時可以發布出去。
平時一般不在master分支上操作,當release分支和hotfix分支合并代碼到master分支上時,master上代碼才更新。
當倉庫創建時,master分支會自己創建。
- ②. Develop
develop分支只有一個。
新特性的開發是基于develop分支的,但不直接在develop分支上開發,特性的開發是在feature分支上進行。
當develop分支上的特性足夠多以至于可以進行新版本的發布時,可以創建release分支的。
- ③. Feature
可以同時存在多個feature分支,新特性的開發正是在此分支上面。
可以對每個新特性創建一個新的feature分支,當該特性開發完畢,將此feature分支合并到develop分支。
創建一個新的feature分支,可以使用以下命令:
git flow feature start test
執行以下命令后,feature/test分支會被創建。
當特性開發完畢,需要將此分支合并到develop分支,可以使用以下命令實現:
git flow feature finish test
上面的命令會將feature/test分支的內容merge到develop分支,并將feature/test分支刪除。
feature分支只是存在于本地倉庫,如果需要多個人共同開發此特性,也可以將feature分支推送到過程倉庫。
git flow feature publish test
feature 分支的生命周期持續到特性的開發完畢,當完成特性的開發,你可以使用git的分支管理命令將此feature分支刪除。
- ④. Release
當完成了特性的開發,并且將feature分支上的內容merge到develop分支上,這時可以開始著手準備新版本的發布,release分支正是作為發布而開設的分支。
release分支基于develop分支,在同一時間只有一個release分支,其生命周期較短,只是為了發布而使用。這意味著,在release分支上,只是進行較少代碼修改,比如bug的修復,原有功能的完善等。不允許在release分支增加大的功能,因為這樣會導致release分支的不穩定,不利于發布的進行。
當release分支(例如,v.1.0)被創建出來后,develop分支可能正準備另一版本(例如,v.2.0),因此,當release分支merge回develop分支時,可能會出現沖突,需要手工解決沖突才能繼續merge。
通過以下命令來創建release分支:
git flow release start v.1.0
執行過完上面的命令,release分支release/v.1.0會被創建出來 ,并且切換到該分支。
當完成release分支功能的完善或者bug的修復后,執行以下命令來完成release分支:
git flow release finish v.1.0
這個命令會執行以下的操作:
分支release/v.1.0 merge回master分支
使用release/v.1.0分支名稱打tag
分支release/v.1.0 merge回develop分支
刪除release/v.1.0分支
- ⑤. Hotfix
當發現master分支出現一個需要緊急修復的bug,可以使用hotfix分支。hotfix分支基于master分支,用來修復bug,當完成bug的修復工作后,需要將其merge回master分支。
同一時間只有一個hotfix分支,其生命周期較短。
可以使用以下命令來創建hotfix分支:
git flow hotfix start v.1.0
使用以下命令來結束hotfix分支的生命周期:
git flow hotfix finish v.1.0
這句命令會將hotfix分支merge到master分支和release分支,并刪除該hotfix分支。
值得注意的是,如果bug修復時,正存在著release分支,那么hotfix分支會merge到release分支,而不是develop分支。
可以使用下圖來說明git flow這幾分支的常用命令:
git flow commands
結束語:
在開發的整個階段,只有兩個主分支貫穿于整個開發階段:master分支和develop分支。功能特性的開發以及bug的修復都通過創建新的分支來實現,且這些分支的生命周期都比較短暫。開發成員之間的開發可以做到盡量不干擾對方,這保證了代碼的穩定性。