本文介紹我一年前在自己的項(xiàng)目(包括工作項(xiàng)目和私人項(xiàng)目)中引入的git分支模式,這個(gè)模式很成功。
主要分支
中央倉(cāng)庫(kù)中有兩個(gè)長(zhǎng)期的分支:
- master
- develop
`master` 用作生產(chǎn)分支愧捕,里面的代碼是準(zhǔn)備部署到生產(chǎn)環(huán)境的。
`develop` 是可交付的開(kāi)發(fā)代碼饥瓷,也可以看成是用于集成分支舷丹,每晚構(gòu)建從 `develop` 獲取代碼。
當(dāng) `develop` 分支中的代碼足夠穩(wěn)定的時(shí)候翘魄,就將改動(dòng)合并到 `master` 分支鼎天,同時(shí)打上一個(gè)標(biāo)簽,標(biāo)簽的名稱為發(fā)布的版本號(hào)暑竟。
輔助分支
通過(guò)輔助分支來(lái)幫助并行開(kāi)發(fā)斋射,和主要分支不同,這些分支的生命周期是有限的:
- 特性分支
- 發(fā)布分支
- 緊急修復(fù)分支
特性分支
特性分支可能從 `develop` 分支分出但荤,最終必須合并回 `develop`罗岖。
特性分支(也叫主題分支)用于開(kāi)發(fā)新特性。每個(gè)新特性開(kāi)一個(gè)新分支腹躁,最終會(huì)合并回 `develop`(當(dāng)特性開(kāi)發(fā)完畢的時(shí)候)桑包,或者放棄(如果最終決定不開(kāi)發(fā)這個(gè)特性)。
特性分支只存在于開(kāi)發(fā)者的倉(cāng)庫(kù)中纺非。
#### 創(chuàng)建一個(gè)特性分支
從 `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` 確毖屏耍總是新生成一個(gè)提交赘方,避免丟失曾經(jīng)存在一個(gè)特性分支的歷史信息,也能夠方便地看出哪些提交屬于同一個(gè)特性弱左。比較:
發(fā)布分支
發(fā)布分支可能從 `develop` 分出窄陡,最終必須合并回 `develop` 和 `master`。發(fā)布分支以 `release-*` 的方式命名拆火。
發(fā)布分支為新的發(fā)布版本作準(zhǔn)備跳夭,包括一些小bug的修正和發(fā)布的元信息(版本號(hào)、發(fā)布日期等)的添加榜掌。這樣 `develop` 分支就可以接受針對(duì)以后的發(fā)布的新特性优妙。
在代碼基本可以發(fā)布的時(shí)候從 `develop` 分支分出發(fā)布分支。這時(shí)要確保此次發(fā)布包括的特性都已經(jīng)合并到 `develop` 分支了(同時(shí)憎账,為下一版發(fā)布準(zhǔn)備的特性不能合并到 `develop` 分支套硼,必須等待發(fā)布分支分出后才能合并)。
創(chuàng)建發(fā)布分支
```
$ 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` 是一個(gè)腳本胞皱,修改相應(yīng)文件的信息邪意,以體現(xiàn)版本號(hào)已經(jīng)改變了。
完成發(fā)布分支
當(dāng)發(fā)布分支中的代碼可以發(fā)布的時(shí)候反砌,將代碼合并到 `master` 分支雾鬼,并打上相應(yīng)的標(biāo)簽。同時(shí)還需要合并到 `develop` 分支宴树,因?yàn)榘l(fā)布分支里可能包含一些修正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` 分支很可能導(dǎo)致合并沖突又憨,我們需要手工修復(fù)一下,然后提交锭吨。之后可以刪除發(fā)布分支:
```
$ git branch -d release-1.2
```
緊急修復(fù)分支
可能從 `master` 分出蠢莺,必須合并回 `develop` 和 `master` 。分支名以 `hotfix-*` 開(kāi)頭零如。
緊急修復(fù)分支和發(fā)布分支很像躏将,只不過(guò)它們是意料之外的。如果生產(chǎn)系統(tǒng)里有一個(gè)緊急的bug考蕾,必須馬上修復(fù)的話祸憋,我們就從 `master` 里分出一個(gè)緊急修復(fù)分支。
這樣肖卧,某個(gè)人修復(fù)緊急bug的同時(shí)夺衍,團(tuán)隊(duì)其他成員可以繼續(xù)在 `develop` 分支上開(kāi)發(fā)。
創(chuàng)建緊急修復(fù)分支
```
$ 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"
```
修復(fù)bug并提交
```
$ git commit -m "Fixed severe production problem"
```
完成緊急修復(fù)分支
修復(fù)bug之后喜命,需要合并回 `master`沟沙,同時(shí)也需要合并回 `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
```
以上情況假定不存在發(fā)布分支壁榕。假設(shè)存在發(fā)布分支的話矛紫,代碼不應(yīng)該合并回 `develop`,而應(yīng)該合并回發(fā)布分支牌里,確保正在準(zhǔn)備的發(fā)布分支也能收到這個(gè)補(bǔ)都找А(由于發(fā)布分支最終會(huì)合并到 `develop`,因此這時(shí)不用再另外合并到 `develop`)牡辽。
最后喳篇,刪除這個(gè)緊急修復(fù)分支:
```
$ git branch -d hotfix-1.2.1
```
全文完。
文章轉(zhuǎn)載自:http://apibrain.com/git-branch-best-practice.html