?
什么是GitFlow?
Git Flow定義了一個項目發(fā)布的分支模型,為管理具有預(yù)定發(fā)布周期的大型項目提供了一個健壯的框架,是由 Vincent Driessen 提出的一個 git操作流程標準、解決當分支過多時 , 如何有效快速管理這些分支。
使用GitFlow 的優(yōu)勢
并行開發(fā):GitFlow可以很方便的實現(xiàn)并行開發(fā)。每個新功能都會建立一個新的 feature分支,從而和已經(jīng)完成的功能隔離開來,而且只有在新功能完成開發(fā)的情況下,其對應(yīng)的feature分支才會合并到主開發(fā)分支上(也就是我們經(jīng)常說的develop分支)。另外,如果你正在開發(fā)某個功能,同時又有一個新的功能需要開發(fā),你只需要提交當前 feature 的代碼,然后創(chuàng)建另外一個feature 分支并完成新功能開發(fā)。然后再切回之前的 feature 分支即可繼續(xù)完成之前功能的開發(fā)。
協(xié)作開發(fā):GitFlow 還支持多人協(xié)同開發(fā),因為每個 feature 分支上改動的代碼都只是為了讓某個新的 feature 可以獨立運行。同時我們也很容易知道每個人都在干啥。
階段式發(fā)布:當一個新 feature 開發(fā)完成的時候,它會被合并到 develop 分支,這個分支主要用來暫時保存那些還沒有發(fā)布的內(nèi)容,所以如果需要再開發(fā)新的 feature,我們只需要從 develop 分支創(chuàng)建新分支,即可包含所有已經(jīng)完成的 feature 。
支持緊急修復(fù):GitFlow 還包含了 hotfix 分支。這種類型的分支是從master上創(chuàng)建出來并做一個緊急的修復(fù),而且這個緊急修復(fù)只影響這個已經(jīng)發(fā)布的 tag,而不會影響到你正在開發(fā)的新 feature。
GitFlow基本分支
·? master分支存放所有正式發(fā)布的版本,可以作為項目歷史版本記錄分支,不直接提交代碼。僅用于保持一個對應(yīng)線上運行代碼的code base。
·? develop分支為主開發(fā)分支,不直接提交代碼
·? feature分支為新功能分支,feature分支都是基于develop創(chuàng)建的,開發(fā)完成后會合并到develop分支上。同時存在多個
·? release分支基于最新develop分支創(chuàng)建,當新功能足夠發(fā)布一個新版本(或者接近新版本發(fā)布的截止日期),從develop分支創(chuàng)建一個release分支作為新版本的起點,用于測試,所有的測試bug在這個分支改。測試完成后合并到master并打上版本號,同時也合并到develop,更新最新開發(fā)分支。(一旦打了release分支之后不要從develop分支上合并新的改動到release分支),同一時間只有1個,生命周期很短,只是為了發(fā)布。
·? hotfix分支基于master分支創(chuàng)建,對線上版本的bug進行修復(fù),完成后直接合并到master分支和develop分支,如果當前還有新功能release分支,也同步到release分支上。同一時間只有1個,生命周期較短
Git Flow使用
1、安裝Git Flow(最新的git bash已經(jīng)支持,不用安裝)/ Sourcetree。
2、Git Flow常用命令,也可以使用Git命令按照gitflow的流程執(zhí)行。
gitflow init:初始化一個現(xiàn)有的 git 庫,將會設(shè)置一些初始的參數(shù),如分支前綴名等,建議用默認值。
git flow feature start [featureBranchName]: 創(chuàng)建一個基于develop的feature分支,并切換到這個分支之下。
git flow feature publish [featureBranchName]:將feature 分支上傳至遠端,也可以使用git的push命令
git flow feature finish [featureBranchName]: 結(jié)束 feature 分支,并 merge 至 develop, 刪除本地分支、遠程分支(如已推送至倉庫), 切換回develop分支。
git flow release start [releaseBranchName]:開始準備release版本,從 develop分支開始創(chuàng)建一個 release 分支。
git flow release publish [releaseBranchName]:將 release 分支上傳至遠端, 也可以使用git的push命令。
git flow release finish [releaseBranchName]:完成 release 測試,自動將代碼 merge 到 master 和develop 分支,用 release 分支名打 Tag,刪除本地分支、遠程分支(如已推送至倉庫)。
git flow hotfix start [hotfixBranchName]:基于 master 分支新建hotfix分支。
git flow hotfix publish [hotfixBranchName]:將hotfix分支上傳至遠端, 也可以使用git的push命令。
git flow hotfix finish [hotfixBranchName]:結(jié)束 hotfix 分支,并 merge 到 master 分支和develop 分支, 自動打tag,刪除本地分支、遠程分支(如已推送至倉庫)。
3、GitFlow 插件,jgitflow-maven-plugin,可以簡化整個流程,讓很多操作自動化。
官方文檔:https://bitbucket.org/atlassian/jgit-flow/wiki/Home
Git Flow基礎(chǔ)開發(fā)流程和命令
git-flow 命令工具,
◆創(chuàng)建git-flow 分支模型:
a.在一個全新目錄下構(gòu)建 git-flow 模型:git flow init 一路默認Enter鍵即可
b.在現(xiàn)有的版本庫構(gòu)建(businessno-service):git flow init
構(gòu)建成功后自動會切換到develop分支,見上圖
◆新功能開發(fā),代號V1.0
任何開發(fā)都必須基于develop分支:git flow feature start V1.0
git-flow 基于develop 創(chuàng)建分支feature/V1.0,并自動切換到feature/V1.0.進行此次開發(fā)。
??推送分支到遠程倉庫:git flow feature publish V1.0或者
git push --set—upstream origin feature/V1.0
完成功能開發(fā): git flow feature finish V1.0
feature/V1.0 分支的代碼會被合并到 develop 里面,然后刪除該分支,切換回 develop,此時develop并未推送到遠程倉庫。需執(zhí)行g(shù)it push進行推送。
◆測試/發(fā)布上線,代號1.0
??基于develop,創(chuàng)建測試/發(fā)布分支:git flow release start 1.0
注意:這里不會自動推送release/1.0分支到倉庫,需執(zhí)行g(shù)it push或者publish,這時進行測試就拿這個分支進行。否則分支只是在本地。測試發(fā)現(xiàn)bug在此分支進行修改。
完成release 測試:git flow release finish 1.0
自動將代碼 merge 到master 和 develop 分支,將本地和遠程倉庫的release/1.0刪除,自動打包
查看tag:git tag?
推送tag至倉庫:git push origin? --tags發(fā)布tag 1.0上線
◆緊急 bug 修正,代號bug1
基于master,開啟熱修復(fù)分支:git flow hotfix start bug1
注意:自動切換到hotfix/bug1分支,只會在本地創(chuàng)建分支,需要執(zhí)行g(shù)it push推送至遠程倉庫,使用此分支進行測試,發(fā)現(xiàn)bug在此分支修改。
測試通過: git flow hotfix finish bug1
推送develop/master分支至遠程倉庫:git push
查看tag:git tag
推送tag至遠程倉庫:git
push origin ---tags
git-flow 會依次切換到 master develop 分支下合并 hotfix/bug1,然后刪掉 hotfix/bug1。hotfix 完成自動打tag為bug1,需要注意需要單獨切換到develop和master分支進行手動git push代碼才會到遠程倉庫,生產(chǎn)發(fā)布使用bug1即可
總結(jié):
1、git-flow 的 feature release 都是從develop 分支創(chuàng)建,hotfix support 都是從 master 分支創(chuàng)建。
2、最穩(wěn)定的代碼放在 master 分支上,禁止直接在 master 分支上提交代碼,只能代碼合并操作。
3、我們?nèi)粘i_發(fā)需要從 master 分支拉一條 develop 分支出來,禁止直接在該分支上提交代碼,只能合并操作。
4、所有的開發(fā)任務(wù)都是從 develop分支拉出一條 feature 分支,并手動推送至遠程倉庫(可選),可以按JIRA任務(wù)來創(chuàng)建feature分支,finish之后會把代碼合并到本地develop分支、刪除該分支。
5、當開發(fā)完畢后,此時需要從 develop 分支上拉出一條 release 分支并手動推送至遠程倉庫,隨后將針對 release 分支部署測試環(huán)境,測試人員在該分支上進行測試,開發(fā)人員在該分支上修改 bug。
6、測試通過無bug 時,我們可將該 release 分支部署到預(yù)發(fā)環(huán)境,再次驗證以后,均無任何 bug,此時可將 release 分支部署到生產(chǎn)環(huán)境。
7、待上線完成后,將 release 分支上的代碼同時合并到本地 develop 分支與master 分支,自動打tag、刪除該分支(develop\master\tag都需要手動push到遠程倉庫)。
8、當生產(chǎn)環(huán)境發(fā)現(xiàn) bug 時,我們從master拉出一條 hotfix 分支,并在該分支上做 bug 修復(fù)。bug 完全修復(fù)后,hotfix分支上的代碼同時合并到本地develop 分支與 master 分支、自動打tag、刪除該分支(develop\master\tag都需要手動push到遠程倉庫