近期困惑於Git代碼版本控制,集中兩天時間研究,其中基礎知識來源於《Git權威指南》,分支思想則來源於一篇博文《A successful Git branching model》(做者:Vincent Driessen,原文連接:http://nvie.com/posts/a-successful-git-branching-model/),細讀之下,受益不淺,僅於此文記錄心得,詳細內容請參考原文。git
Main Branchpost
master測試
主分支,表明着部署(生產)環境最新版本的代碼狀態,即代碼始終與部署環境最新版本代碼保持一致;版本控制
developcode
開發分支,表明着即將發佈的下一個版本的代碼狀態;也能夠理解爲「整合」分支,開發新特性或修復Bug過程當中產生的新代碼須要按期合併至開發分支,用於「每日」構建。生命週期
當開發分支(develop)中的代碼穩定到一個可發佈的狀態時,須要被合併至主分支(master),由主分支建立相應版本(Tag)。開發
Supporting Branch部署
Featureget
特性分支,用於開發新的功能特性,生命週期以下:it
(1)須要開發新的功能特性時,從開發分支建立一個或多個特性分支;
git checkout -b myfeature develop
(2)新的功能特性開發完成時,特性分支須要合併至開發分支;
git checkout develop git merge --no-ff myfeature
(3)刪除特性分支;
git branch -d myfeature
(4)推送開發分支至遠程版本庫;
git push origin develop
注:特性分支僅存在於開發者的本地環境中,通常不將其推送至遠程版本庫。
Release
發佈分支,特定版本發佈以前的「準備」分支,用於測試或Bug修復,生命週期以下:
(1)某一個版本的功能特性所有開發完成(即該版本的全部功能特性分支已所有合併至開發分支)以後、正式發佈以前須要建立相應的發佈分支;
git checkout -b release-1.2 develop
注:之因此須要建立發佈分支,是由於發佈分支一旦建立完成,發佈分支測試或修復Bug的過程當中,開發分支可同時用於下一個版本的代碼開發。
(2)更新、提交版本信息;
./bump-version.sh 1.2 git commit -m "Bumped version number to 1.2"
bump-version.sh只是一個示例腳本,用於更新版本文件中的版本號,也能夠根據實際狀況手動更新版本號。
(3)測試或Bug修復,均在此發佈分支中進行;
(4)測試或Bug修復完成以後,合併至主分支、建立版本、推送至遠程版本庫;
git checkout master git merge --no-ff release-1.2 git push origin master git tag -m "Version 1.2" 1.2 git push origin 1.2
(5)也須要合併至開發分支、推送至遠程版本庫;
git checkout develop git merge --no-ff release-1.2 git push origin develop
(6)刪除發佈分支;
git branch -d release-1.2
注1:爲何不是發佈分支合併至開發分支,再由開發分支合併至主分支?這是由於發佈分支在測試或Bug修復過程當中,開發分支可能會參與下一個版本的代碼開發,這樣作當前版本的代碼中能夠混合有下一個版本尚爲完成的代碼。
注2 :發佈分支合併至主分支及開發分支時,因爲涉及到版本號更新,因具體方式不一樣,可能會出現衝突;合併至主分支時,以發佈分支爲主;合併至開發分支時,以開發分支爲主。
Hotfix
修復分支,用於修復已發佈版本中存在的Bug,生命週期以下:
(1)某一個已發佈版本存在Bug時,須要從相應版本建立修復分支,修復Bug及測試;
git checkout -b hotfix-1.2.1 1.2
(2)更新、提交版本信息;
./bump-version.sh 1.2.1 git commit -m 「Bumped version number to 1.2.1」
(3)修復Bug及測試完成以後,建立新版本,並推送至遠程版本庫;
git tag -m "Version 1.2.1」 1.2.1 git push origin 1.2.1
(4)也須要合併至開發分支,並推送至遠程版本庫;
git checkout develop git merge --no-ff hotfix-1.2.1 git push origin develop
(5)刪除修復分支;
git branch -d hotfix-1.2.1
注1:修復分支(1)與(3)原文描述不相符,主要出於如下幾個方面的考慮:
(1)主分支(master)僅維護最新版本代碼;
(2)部署環境可能同時使用多個版本代碼,且版本之間存在代碼不兼容的狀況;
(3)Bug可能出如今比較「舊」的版本中;
若是任何一個版本的Bug修復都從主分支建立修復分支,而後再合併至主分支,可能會致使代碼混亂。
注2:合併至開發分支可使得後續新發布的版本中再也不包含已修復的Bug。
注3:修復特定版本的Bug時,須要在「大」版本號(1.2)的基礎之上建立「小」版本號。
Code Deploy
代碼部署,並不在原文討論範圍以內,但也是很是重要的一點,這裏僅描述一下本身的方式:
git clone
git pull
git checkout
注:能夠經過版本文件中的版本號確認具體版本信息。
Git Flow具體方式方法差別化較大,爭議較多,歡迎指正討論。