參考:
http://www.ruanyifeng.com/blog/2012/07/git.html
(阮一峯)
http://segmentfault.com/a/1190000000434973
http://nvie.com/posts/a-successful-git-branching-model/
(英文)
整理一下:
主要分支
中央倉庫中有兩個長期的分支:
- master
- develop
master
用作生產分支,裏面的代碼是準備部署到生產環境的。
develop
是可交付的開發代碼,也可以看成是用於集成分支,每晚構建從develop
獲取代碼。
當develop
分支中的代碼足夠穩定的時候,就將改動合併到master
分支,同時打上一個標籤,標籤的名稱爲發佈的版本號。
輔助分支
通過輔助分支來幫助並行開發,和主要分支不同,這些分支的生命週期是有限的:
- 特性分支
- 發佈分支
- 緊急修復分支
特性分支
特性分支可能從develop
分支分出,最終必須合併回develop
。
特性分支(也叫主題分支)用於開發新特性。每個新特性開一個新分支,最終會合並回develop
(當特性開發完畢的時候),或者放棄(如果最終決定不開發這個特性)。
特性分支只存在於開發者的倉庫中。
創建一個特性分支
從develop
分支分出:
$ git checkout -b myfeature develop
合併回develop
完成的特性需要合併回develop
:
$ git checkout develop
$ git merge --no-ff myfeature
$ git branch -d myfeature
$ git push origin develop
使用--no-ff
確保總是新生成一個提交,避免丟失曾經存在一個特性分支的歷史信息,也能夠方便地看出哪些提交屬於同一個特性。比較:
發佈分支
發佈分支可能從develop
分出,最終必須合併回1develop
和master
。發佈分支以release-*
的方式命名。
發佈分支爲新的發佈版本作準備,包括一些小bug的修正和發佈的元信息(版本號、發佈日期等)的添加。這樣develop
分支就可以接受針對以後的發佈的新特性。
在代碼基本可以發佈的時候從develop
分支分出發佈分支。這時要確保此次發佈包括的特性都已經合併到develop
分支了(同時,爲下一版發佈準備的特性不能合併到develop
分支,必須等待發布分支分出後才能合併)。
創建發佈分支
$ git checkout -b release-1.2 develop
$ ./bump-version.sh 1.2
$ git commit -a -m "Bumped version number to 1.2"
bump-version.sh
是一個腳本,修改相應文件的信息,以體現版本號已經改變了。
完成發佈分支
當發佈分支中的代碼可以發佈的時候,將代碼合併到master
分支,並打上相應的標籤。同時還需要合併到develop
分支,因爲發佈分支裏可能包含一些修正bug的代碼,合並回去可以確保以後的版本也包含這些修正。
$ git checkout master
$ git merge --no-ff release-1.2
$ git tag -a 1.2
$ git checkout develop
$ git merge --no-ff release-1.2
注意,合併回develop
分支很可能導致合併衝突,我們需要手工修復一下,然後提交。之後可以刪除發佈分支:
$ git branch -d release-1.2
緊急修復分支
可能從master
分出,必須合併回develop
和master
。分支名以hotfix-*
開頭。
緊急修復分支和發佈分支很像,只不過它們是意料之外的。如果生產系統裏有一個緊急的bug,必須馬上修復的話,我們就從master
裏分出一個緊急修復分支。
這樣,某個人修復緊急bug的同時,團隊其他成員可以繼續在develop
分支上開發。
創建緊急修復分支
$ git checkout -b hotfix-1.2.1 master
$ ./bump-version.sh 1.2.1
$ git commit -a -m "Bumped version number to 1.2.1"
修復bug並提交
$ git commit -m "Fixed severe production problem"
完成緊急修復分支
修復bug之後,需要合併回master
,同時也需要合併回develop
。
$ git checkout master
$ git merge --no-ff hotfix-1.2.1
$ git tag -a 1.2.1
$ git checkout develop
$ git merge --no-ff hotfix-1.2.1
以上情況假定不存在發佈分支。假設存在發佈分支的話,代碼不應該合併回develop
,而應該合併回發佈分支,確保正在準備的發佈分支也能收到這個補丁(由於發佈分支最終會合併到develop
,因此這時不用再另外合併到develop
)。
最後,刪除這個緊急修復分支:
$ git branch -d hotfix-1.2.1