簡(jiǎn)述Git Flow
首先,Git Flow
并不是Git
的替代品,Git Flow
只是把標(biāo)準(zhǔn)的Git
命令用腳本組合了起來(lái)办绝,形成比較有效而簡(jiǎn)單的命令。
Git Flow
只是給我們提供一個(gè)更簡(jiǎn)便的工作流程命令田绑,而更重要的是我們需要去學(xué)習(xí)和理解關(guān)于版本控制系統(tǒng)的工作流程,才能有效的迭代產(chǎn)品抡爹,避免混亂掩驱。
而當(dāng)項(xiàng)目處于一個(gè)多人協(xié)作的狀態(tài)下,工作流程顯得非常之重要。假設(shè)當(dāng)兩個(gè)甚至多個(gè)開發(fā)者同時(shí)再開發(fā)各自新功能時(shí)欧穴,如果在同一分支上進(jìn)行協(xié)作時(shí)民逼,這必然會(huì)產(chǎn)生大量的沖突。而工作流程的做法苔可,就是每個(gè)開發(fā)者可以各自切出一個(gè)獨(dú)立分支缴挖,當(dāng)各自功能實(shí)現(xiàn)并且測(cè)試成功后,再自行合并到master
分支中焚辅,甚至無(wú)需等待其他功能實(shí)現(xiàn)再一起發(fā)布映屋。
分支應(yīng)用情境
在Git Flow
中,主要的分支有master
同蜻、develop
棚点、hotfix
、release
湾蔓、feature
這五種分支瘫析。master
和develop
分支是我們最常見的分支,它們被稱作長(zhǎng)期分支默责,一直存活在整個(gè)工作流程中贬循,而其它的分支大部分會(huì)因任務(wù)結(jié)束而被刪除。
master分支
該分支主要用來(lái)存放穩(wěn)定桃序、隨時(shí)可以上線的版本杖虾。
這個(gè)分支的來(lái)源只能從別的分支合并過(guò)來(lái),開發(fā)者不會(huì)直接commit
到這個(gè)分支上媒熊。
通常我們也會(huì)在這個(gè)分支上的提交打上版本號(hào)標(biāo)簽奇适。
develop分支
這個(gè)分支主要是所有開發(fā)的基礎(chǔ)分支。
當(dāng)要添加功能時(shí)芦鳍,所有功能都是從這個(gè)分支切出去的嚷往,而功能分支實(shí)現(xiàn)后,也都會(huì)合并回來(lái)這個(gè)分支中柠衅。
hotfix分支
當(dāng)線上產(chǎn)品發(fā)生了緊急問(wèn)題的時(shí)候皮仁,就會(huì)從master
分支中開一個(gè)hotfix
分支出來(lái)進(jìn)行修復(fù)。
當(dāng)hotfix
分支修復(fù)完成之后菲宴,就會(huì)合并到master
分支中魂贬,并且也會(huì)合并到develop
分支中。
release分支
當(dāng)develop
分支完成需求后裙顽,就可以從develop
分支中開一個(gè)release
分支,進(jìn)行上線前最后的測(cè)試宣谈。
測(cè)試完成后愈犹,釋放release
分支將會(huì)同時(shí)合并到master
以及develop
分支中。
feature分支
當(dāng)我們需要補(bǔ)充功能的時(shí)候,就會(huì)從develop
分支中開一個(gè)feature
分支進(jìn)行功能開發(fā)漩怎。
當(dāng)功能實(shí)現(xiàn)后勋颖,在將feature
分支合并到develop
分支中,等待最后的測(cè)試發(fā)布勋锤。
示意圖
安裝與使用
安裝
Mac
brew install git-flow
如果沒有安裝brew
的話可使用下列命令進(jìn)行安裝:
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
Win
初始化
先將項(xiàng)目克隆到本地饭玲。
git clone <project-url>
初始化Git Flow
。
git flow init
命令行會(huì)提示你是否修改Git Flow
提供的默認(rèn)分支前綴叁执。不同場(chǎng)景的分支前綴不同茄厘,默認(rèn)情況下分支前綴是這樣的。
場(chǎng)景 | 分支前綴 |
---|---|
新功能 | feature |
預(yù)發(fā)布 | release |
熱修復(fù) | hotfix |
打標(biāo)簽 | 空 |
Which branch should be used for bringing forth production releases?
- develop
- master
Branch name for production releases: [master]
Which branch should be used for integration of the "next release"?
- develop
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? []
分支前綴的作用是區(qū)分不同分支的使用場(chǎng)景谈宛,同時(shí)當(dāng)你使用Git Flow
命令時(shí)就不需要手動(dòng)增加分支前綴次哈,Git Flow
會(huì)幫你加上。
通常情況下不需要修改默認(rèn)的命名前綴吆录,只需要加上-d
就可以跳過(guò)修改命名步驟窑滞。
git flow init -d
feature場(chǎng)景
[圖片上傳失敗...(image-e844a5-1609829360387)]
當(dāng)我們需要開發(fā)一個(gè)新功能的時(shí)候,此時(shí)需要基于develop
分支拉出feature
分支進(jìn)行開發(fā)恢筝,即feature
場(chǎng)景的生命周期開始哀卫。
通常來(lái)說(shuō),一種場(chǎng)景的完整生命周期至少包含以下幾種行為:
- start :開始開發(fā)
- publish :發(fā)布到遠(yuǎn)程分支
- finish :完成開發(fā)撬槽、合并分支
start
新功能開始開發(fā)前此改,需準(zhǔn)備好開發(fā)分支。
git flow feature start <feature-name>
執(zhí)行上面命令后恢氯,將會(huì)在本地創(chuàng)建一個(gè)名為<feature-name>
的分支带斑,并切換到該分支。
而且無(wú)論你當(dāng)前處于哪個(gè)分支勋拟,它都會(huì)基于本地develop
分支創(chuàng)建的勋磕。
上述命令相當(dāng)于執(zhí)行了下面的Git
操作。
git checkout -b feature/<feature-name> develop
需要注意的一點(diǎn)是敢靡,該分支是基礎(chǔ)本地的
develop
分支創(chuàng)建挂滓,所以執(zhí)行此命令錢一般需要拉取最新的遠(yuǎn)程代碼。
publish
在本地開發(fā)完成新功能并進(jìn)行commit
操作后啸胧,需要將本地代碼提交到遠(yuǎn)程倉(cāng)庫(kù)赶站。
git flow feature publish <feature-name>
該命令主要做了三件事情:
- 創(chuàng)建一個(gè)名為
feature/<feature-name>
的遠(yuǎn)程分支 - 本地分支
track
遠(yuǎn)程分支 - 如果本地存在還沒提交的代碼,就進(jìn)行代碼提交
git push origin feature/<feature-name>
git push --set-upstream origin feature/<feature-name>
git push origin
當(dāng)你執(zhí)行后publish
操作后纺念,后續(xù)還需要進(jìn)行代碼提交的話贝椿,只需執(zhí)行正常的push
命令既可。
git push
finish
當(dāng)功能開發(fā)完畢后就將進(jìn)入測(cè)試階段陷谱,此時(shí)需要將該分支合并到develop
分支烙博。
git flow feature finish <feature-name>
該命令也主要做了三件事情:
- 切換到
develop
分支 - 合并代碼到
develop
分支 - 刪除本地
feature/<feature-name>
分支
git checkout develop
git merge feature/<feature-name>
git branch -d feature/<feature-name>
Git Flow
的merge
操作與默認(rèn)的git merge
操作有些不同瑟蜈。
默認(rèn)情況下它會(huì)檢查本次merge
有多少commit
記錄,如果僅有一條的話采用fast-forward
模式渣窜,即只移動(dòng)HEAD
指針而不會(huì)生成提交記錄铺根;如果超過(guò)一條commit
的話,這采用no-ff
模式乔宿,該模式下則會(huì)多生成一條merge
的commit
記錄位迂。
這樣做的好處是當(dāng)有多條提交記錄時(shí)方便進(jìn)行代碼回退和記錄監(jiān)察,而只有單條提交記錄的時(shí)候則簡(jiǎn)化代碼提交記錄從而便于管理详瑞。
當(dāng)finish
操作過(guò)程中掂林,如果merge
發(fā)生了沖突,則會(huì)終端finish
操作蛤虐,不會(huì)刪除feature/<feature-name>
分支党饮,同時(shí)也處于develop
分支上。
當(dāng)本地沖突解決并commit
后驳庭,重新進(jìn)行finish
操作即可刑顺。
另外,finish
指令還支持三個(gè)附加參數(shù):
-
-r
:即merge前先執(zhí)行rebase
饲常,但即使rebase
后符合fast-forward
條件也不一定會(huì)用fast-forward
蹲堂。 -
-F
:即合并完成連同遠(yuǎn)程分支一并刪除。 -
-k
:即保留本地feature
分支贝淤,不執(zhí)行delete
動(dòng)作柒竞。
release場(chǎng)景
[圖片上傳失敗...(image-e5c7e0-1609829360387)]
當(dāng)新功能開發(fā)完成后,將進(jìn)入測(cè)試階段播聪,此時(shí)需要基于develop
分支拉出release
分支進(jìn)行集成測(cè)試朽基,也有將release
場(chǎng)景作為預(yù)發(fā)布環(huán)境進(jìn)行測(cè)試。
在這種情況下离陶,一般而言release
只有少數(shù)改動(dòng)稼虎。
start
使用start
開啟一個(gè)release
場(chǎng)景。
git flow release start <release-name>
該命令會(huì)基于本地的develop
分支創(chuàng)建一個(gè)release/<release-name>
分支招刨,并切換到這個(gè)分支霎俩。
需要注意一點(diǎn)是,如果本地還有未
finish
的release
分支的話沉眶,將不允許使用start
指令開啟新的release
分支打却,這一點(diǎn)是對(duì)并行發(fā)布的一個(gè)限制。
publish
為了讓其他協(xié)同人員能夠看到該分支并一同測(cè)試谎倔,需要將其發(fā)布出去柳击。
git flow release publish <release-name>
finish
待測(cè)試通過(guò)后需要發(fā)布正式版:
git flow release finish <release-name>
該命令的動(dòng)作會(huì)比較多,大致是:
-
git fetch
片习,拉取最新的代碼 - 將分支合并到
master
分支 - 生成名為
<release-name>
的tag
- 將分支合并到
develop
分支 - 刪除
release/<release-name>
分支 - 切換回
develop
分支
如果merge
產(chǎn)生沖突不會(huì)終止流程腻暮,只是不會(huì)將本地的release
分支刪除彤守。待解決完沖突后需再次執(zhí)行finish
操作。
finish
只是完成了本地代碼的一系列操作哭靖,可使用下列命令進(jìn)行推送所有的分支和tag
。
git push origin --all
git push origin --tag
hotfix場(chǎng)景
如果在線上發(fā)現(xiàn)了bug侈离,需要進(jìn)行緊急修復(fù)的時(shí)候试幽,就需要用到了hotfix
場(chǎng)景。
start
git flow hotfix start <hotfix-name>
該命令將從master
分支創(chuàng)建了一個(gè)hotfix/<hotfix-name>
的分支并切換到該分支卦碾。
finish
hotfix
沒有publish
命令铺坞,因?yàn)?code>Git Flow認(rèn)為hotfix
應(yīng)該是小范圍的改動(dòng),不需要其他協(xié)同人員參與洲胖。
但本地修改結(jié)束并進(jìn)行commit
操作后济榨,則執(zhí)行finish
操作。
git flow hotfix finish <hotfix-name>
該命令所做任務(wù)與release
基本相同绿映,先拉取代碼擒滑,然后將分支合并到master
、develop
分支中叉弦,并且打上tag丐一,然后刪除該分支,最后切回develop
分支淹冰。
其他代碼工作流
與Git Flow
相似的代碼管理工作流還有Github Flow和[Gitlab Flow][https://docs.gitlab.com/ee/topics/gitlab_flow.html]库车。
-
Github Flow
是簡(jiǎn)化版的Git Flow
,它使用了main
和feature
來(lái)管理代碼樱拴,它只有一個(gè)長(zhǎng)期分支柠衍,就是main
。 -
Gitlab Flow
更關(guān)注代碼的持續(xù)集成晶乔,一個(gè)版本需要?jiǎng)?chuàng)建測(cè)試環(huán)境珍坊、預(yù)覽環(huán)境、生成環(huán)境的分支瘪弓,最后匯總到stable branch
分支用于發(fā)布垫蛆。