git flow
是Vincent Driessen
提出了一個分支管理的策略悼潭,非常值得借鑒坟冲。它可以使得版本庫的演進(jìn)保持簡潔,主干清晰邪蛔,各個分支各司其職急黎、井井有條。
先看下Vincent Driessen
提出的分支管理模型圖侧到,以便對git flow
有個大概的了解勃教。
兩種核心分支:
主分支(
Master
):代碼庫應(yīng)該有一個、且僅有一個主分支匠抗。所有提供給用戶使用的正式版本故源,都在這個主分支上發(fā)布。這個分支只能從其它分支合并,不能在這個分支上直接修改汞贸。需要注意的是绳军,所有在master
上的提交應(yīng)該標(biāo)記tag
。開發(fā)主分支(
Develop
):這個分支是我們是我們的主開發(fā)分支矢腻,包含所有要發(fā)布到下一個Release
的代碼门驾,這個主要合并與其他分支,比如Feature
分支多柑。該分支應(yīng)該只是進(jìn)行一些優(yōu)化和升級開發(fā)奶是,如果有新的需求應(yīng)該拉出一個feature
分支。
三種臨時分支 :
功能(
feature
)分支:這個分支主要是用來開發(fā)一個新的功能竣灌,一旦開發(fā)完成聂沙,我們合并回Develop
分支進(jìn)入下一個Release
。預(yù)發(fā)布(
release
)分支:當(dāng)你需要一個發(fā)布一個新Release
的時候初嘹,我們基于Develop
分支創(chuàng)建一個Release
分支及汉,完成Release
后,我們合并到Master
和Develop
分支削樊。修補
bug
(hotfix
)分支:當(dāng)我們在Production
發(fā)現(xiàn)新的Bug
時候豁生,我們需要創(chuàng)建一個Hotfix
, 完成Hotfix
后兔毒,我們合并回Master
和Develop
分支漫贞,所以Hotfix
的改動會進(jìn)入下一個Release
甸箱。image這三種分支都屬于臨時性需要,使用完以后迅脐,應(yīng)該刪除芍殖,使得代碼庫的常設(shè)分支始終只有
master
和develop
。
Git Flow流程示例代碼 :
1. 創(chuàng)建develop分支
從master拉出develop分支
git pull origin master //可選谴蔑,獲取最新版本
git checkout -b develop master
發(fā)布develop分支
git push -u origin develop
2. 創(chuàng)建feature分支
從develop拉出feature_v1.0功能分支
git pull origin develop //可選豌骏,獲取最新版本
git checkout -b feature_v1.0 develop
發(fā)布feature_v1.0分支
git push -u origin feature_v1.0
在feature_v1.0上開發(fā)一些功能
3. 完成feature,合并到develop分支
develop分支獲取最新
git pull origin develop
切換到develop分支
git checkout develop
從feature分支合并到develop分支
git merge --no-ff feature_v1.0
刪除feature分支隐锭,也可以不刪除
git branch -d feature_v1.0
4. 開始release
從develop拉出一個release分支
git pull origin develop //可選窃躲,獲取最新版本
git checkout -b release_v1.0 develop
fix bugs
5. 完成release,合并到master分支和develop分支钦睡,在master打上tag標(biāo)記
合并到master
git checkout master
git merge --no-ff release_v1.0
在master打tag標(biāo)記
git tag release1.0 master
git push --tags
合并到develop
git checkout develop
git merge --no-ff release_v1.0
6. 開始hotfix
從主線master拉出一個hotfix分支
git pull origin master //可選蒂窒,獲取最新版本
git checkout -b hotfix_v1.0.1 master
7. 完成hotfix,合并到master和develop荞怒,并在master上打tag洒琢。
合并hotfix_v1.0.1到master
git checkout master
git merge --no-ff hotfix_v1.0.1
在master打上tag
git tag hotfix1.0.1 master
git push --tags
合并hotfix_v1.0.1到develop
git checkout develop
git merge --no-ff hotfix_v1.0.1
分支命名規(guī)范:
feature分支:以"feature_"開頭,如feature_v1.1
release分支:以"release_"開頭褐桌,如release_v1.1
hotfix分支:以"hotfix_"開頭衰抑,如hotfix_20160112
tag標(biāo)記:如果是release分支合并,則以"release_"開頭荧嵌。如果是hotfix分支合并呛踊,則以"hotfix_"開頭。
master分支每次提交都要打tag啦撮,release tag:如release_v1.1恋技,hotfix tag:如hotfix_20160112
命名都統(tǒng)一采用小寫。
總結(jié):
- 一定要按git flow的流程去管理分支逻族,如feature分支開發(fā)完要合并到develop蜻底,如果要發(fā)布版本到test環(huán)境,則從develop拉出一個release分支聘鳞,release完成后要合并回master和develop分支薄辅,修復(fù)生產(chǎn)環(huán)境問題需要從master拉出一個hotfix分支,hotfix完成后要合并回master和develop分支抠璃,并且在master打上tag站楚。
- 一定要按分支命名規(guī)范來命名,便于管理和維護(hù)搏嗡。
- 了解了git flow工作流程后窿春,可以不使用git flow GUI工具拉一,手動操作即可,可以是原生git命令+vs配合操作旧乞,比如給master打tag就要用git命令蔚润,這在vs里操作不了的,比如合并分支尺栖,雖然也可以使用git命令實現(xiàn)嫡纠,但在vs里操作更方便直觀。
- 一定要保持分支的純凈延赌,不要隨便污染分支除盏。比如,develop分支只包含要發(fā)布到下一個release的代碼挫以,在沒有拉出release分支前不要合并新的feature分支進(jìn)來者蠕。release分支基于develop分支創(chuàng)建,拉出release分支后掐松,我們可以在這個release分支上測試和修復(fù)bug踱侣,但是,一旦打了release分支后不要從develop分支合并新的改動過來甩栈。develop拉出release分支的同時泻仙,也意味著develop分支可以開始下一個release的準(zhǔn)備工作了。
如果多個版本并行到test環(huán)境量没,怎么解決這個問題玉转?如下圖。