git分支最佳實踐

本文介紹我一年前在本身的項目(包括工做項目和私人項目)中引入的git分支模式,這個模式很成功。git

主要分支

中央倉庫中有兩個長期的分支:segmentfault

  • master
  • develop

master用做生產分支,裏面的代碼是準備部署到生產環境的。post

develop是可交付的開發代碼,也能夠當作是用於集成分支,每晚構建從develop獲取代碼。spa

develop分支中的代碼足夠穩定的時候,就將改動合併到master分支,同時打上一個標籤,標籤的名稱爲發佈的版本號。翻譯

輔助分支

經過輔助分支來幫助並行開發,和主要分支不一樣,這些分支的生命週期是有限的:code

  • 特性分支
  • 發佈分支
  • 緊急修復分支

特性分支

特性分支可能從develop分支分出,最終必須合併回develop生命週期

特性分支(也叫主題分支)用於開發新特性。每一個新特性開一個新分支,最終會合並回develop(當特性開發完畢的時候),或者放棄(若是最終決定不開發這個特性)。開發

特性分支只存在於開發者的倉庫中。部署

建立一個特性分支

develop分支分出:get

$ 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確保老是新生成一個提交,避免丟失曾經存在一個特性分支的歷史信息,也可以方便地看出哪些提交屬於同一個特性。比較:

![merge --no-ff]http://segmentfault.com/img/bVbYDZ

發佈分支

發佈分支可能從develop分出,最終必須合併回1developmaster。發佈分支以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分出,必須合併回developmaster。分支名以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

原文 A successful Git branching model
翻譯 SegmentFault

相關文章
相關標籤/搜索