git flow是Vincent Driessen提出了一個分支管理的策略,很是值得借鑑。它可使得版本庫的演進保持簡潔,主幹清晰,各個分支各司其職、層次分明。git
先看下Vincent Driessen提出的分支管理模型圖,以便對git flow有個大概的瞭解。app
主分支(Master):代碼庫應該有一個、且僅有一個主分支。全部提供給用戶使用的正式版本,都在這個主分支上發佈。這個分支只能從其它分支合併,不能在這個分支上直接修改。須要注意的是,全部在master上的提交應該標記tag。工具
開發主分支(Develop):這個分支是咱們是咱們的主開發分支,包含全部要發佈到下一個Release的代碼,這個主要合併與其餘分支,好比Feature分支。該分支應該只是進行一些優化和升級開發,若是有新的需求應該拉出一個feature分支。測試
功能(feature)分支:這個分支主要是用來開發一個新的功能,一旦開發完成,咱們合併回Develop分支進入下一個Release。優化
預發佈(release)分支:當你須要一個發佈一個新Release的時候,咱們基於Develop分支建立一個Release分支,完成Release後,咱們合併到Master和Develop分支。3d
修補bug(hotfix)分支:當咱們在Production發現新的Bug時候,咱們須要建立一個Hotfix, 完成Hotfix後,咱們合併回Master和Develop分支,因此Hotfix的改動會進入下一個Release。blog
這三種分支都屬於臨時性須要,使用完之後,應該刪除,使得代碼庫的常設分支始終只有master和develop。ip
1,建立develop分支開發
#從master拉出develop分支get
#可選,獲取最新版本。git pull origin master
git checkout -b develop master
#發佈develop分支
git push -u origin develop
2,建立feature分支
#從develop拉出feature_v1.0功能分支
#可選,獲取最新版本。git pull origin develop
git checkout -b feature_v1.0 develop
#發佈feature_v1.0分支
git push -u origin feature_v1.0
#在feature_v1.0上開發一些功能
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標記
#合併到master
git checkout master
git merge --no-ff release_v1.0
#在master打tag標記
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
feature分支:以"feature_"開頭,如feature_v1.1
release分支:以"release_"開頭,如release_v1.1
hotfix分支:以"hotfix_"開頭,如hotfix_20160112
tag標記:若是是release分支合併,則以"release_"開頭。若是是hotfix分支合併,則以"hotfix_"開頭。
master分支每次提交都要打tag,release tag:如release_v1.1,hotfix tag:如hotfix_20160112
命名都統一採用小寫。
1,必定要按git flow的流程去管理分支,如feature分支開發完要合併到develop,若是要發佈版本到test環境,則從develop拉出一個release分支,release完成後要合併回master和develop分支,修復生產環境問題須要從master拉出一個hotfix分支,hotfix完成後要合併回master和develop分支,而且在master打上tag。
2,必定要按分支命名規範來命名,便於管理和維護。
3,瞭解了git flow工做流程後,能夠不使用git flow GUI工具,手動操做便可,能夠是原生git命令+vs配合操做,好比給master打tag就要用git命令,這在vs裏操做不了的,好比合並分支,雖然也可使用git命令實現,但在vs裏操做更方便直觀。
4,必定要保持分支的純淨,不要隨便污染分支。好比,develop分支只包含要發佈到下一個release的代碼,在沒有拉出release分支前不要合併新的feature分支進來。release分支基於develop分支建立,拉出release分支後,咱們能夠在這個release分支上測試和修復bug,可是,一旦打了release分支後不要從develop分支合併新的改動過來。develop拉出release分支的同時,也意味着develop分支能夠開始下一個release的準備工做了。
5,若是多個版本並行到test環境,怎麼解決這個問題?以下圖。