為什么要有分支
建立分支的原因是 git 因?yàn)槭欠植际降模云浜诵木褪欠种Ю扰福种У囊饬x在于壁酬,可以將項(xiàng)目代碼按照功能次酌、模塊拆分成不同的分支恨课。比如這個(gè)產(chǎn)品要加一個(gè)支付功能和一個(gè)登陸功能,可以創(chuàng)建兩個(gè)分支岳服,交給不同的開(kāi)發(fā)人員并行開(kāi)發(fā)剂公。登陸功能先開(kāi)發(fā)完,測(cè)試無(wú)誤后合并改分支到 master 分支吊宋,master 分支部署上線纲辽。支付功能雖然沒(méi)有開(kāi)發(fā)完成,但是在另一條分支上璃搜,所以產(chǎn)品上線和功能開(kāi)發(fā)完全不受影響拖吼。這才是分布式開(kāi)發(fā)的高效模式。還有這樣这吻,以自己名字建立一個(gè)分支比如 xiancai吊档,這個(gè)分支是已經(jīng)做好的功能,隨時(shí)可以合并到 master 上線唾糯,開(kāi)發(fā)的時(shí)候怠硼,建立一個(gè)帶功能前綴的分支,比如 xiancai-ninghao 趾断、xiancai-ninghao 等等拒名,開(kāi)發(fā)完之后在合并到 xiancai,每次上線芋酌,把 xiancai 合并到 master 增显。總之分支的做重要的意義就是提高效率F甑邸M啤! 這樣方便團(tuán)隊(duì)開(kāi)發(fā)堵腹,并且不會(huì)導(dǎo)致混亂炸站。
分支有如下幾條:
- Master 主分支
- Develop 分支
- Feature 功能分支
- Release 預(yù)發(fā)布分支
- Hotfix(或者Fixbug) 分支
以上各分支之間的邏輯關(guān)系見(jiàn)下圖;
![](http://i.imgur.com/i9y14Ta.png)
其中對(duì)于 Feature 功能分支有疚顷;
- 從哪個(gè)分支分離開(kāi)來(lái):develop
- 必須要合并到哪個(gè)分支上:develop
- 分支的命名規(guī)范:除了 master旱易,develop,release-腿堤,或者 hotfix- 以外的名字都可以比如可以用 feature-*的方式命名阀坏。
其中對(duì)于 Release 預(yù)發(fā)布分支有;
- 從哪個(gè)分支分離開(kāi)來(lái): develop
- 必須要合并到哪個(gè)分支上:develop 與 master
- 分支的命名規(guī)范: release-*
其中對(duì)于 Hotfix(或者 Fixbug) 分支有笆檀;
- 從哪個(gè)分支分離開(kāi)來(lái):master
- 必須要合并到哪個(gè)分支上:develop 與 master
- 分支的命名規(guī)范:hotfix-* 或者 fixbug-*
主分支
Master 主分支
首先忌堂,代碼庫(kù)應(yīng)該有一個(gè)、且僅有一個(gè)主分支酗洒。所有提供給用戶使用的正式版本士修,都在這個(gè)主分支上發(fā)布枷遂。Git 主分支的名字,默認(rèn)叫做 Master棋嘲。它是自動(dòng)建立的酒唉,版本庫(kù)初始化以后,默認(rèn)就是在主分支在進(jìn)行開(kāi)發(fā)封字。
![](http://i.imgur.com/rDLztjA.png)
Develop 分支
主分支只用來(lái)分布重大版本黔州,日常開(kāi)發(fā)應(yīng)該在另一條分支上完成耍鬓。我們把開(kāi)發(fā)用的分支阔籽,叫做 Develop。
![](http://i.imgur.com/BJvCsMq.png)
創(chuàng)建分支
git branch develop #只創(chuàng)建分支
git checkout develop #創(chuàng)建并切換到 develop 分支
合并分支
git checkout master #切換到主分支
git merge --no-ff develop #把 develop 合并到 master 分支牲蜀,no-ff 選項(xiàng)的作用是保留原分支記錄
git branch -d develop #刪除 develop 分支
這里稍微解釋一下笆制,上一條命令的--no-ff參數(shù)是什么意思。默認(rèn)情況下涣达,Git執(zhí)行"快進(jìn)式合并"(fast-farward merge)在辆,會(huì)直接將Master分支指向Develop分支。
![](http://i.imgur.com/Kt1rngH.png)
![](http://i.imgur.com/rDt0UhJ.png)
![](http://i.imgur.com/RO8TwAD.png)
次分支
除了 master 與 develop 這兩個(gè)主分支度苔,在開(kāi)發(fā)時(shí)還可以創(chuàng)建一些次分支匆篓,目的是讓團(tuán)隊(duì)不同的成員之間可以平行開(kāi)發(fā),更容易跟蹤功能寇窑,準(zhǔn)備為生產(chǎn)的發(fā)行版鸦概,快速修復(fù)生產(chǎn)上的問(wèn)題等等。這些分支生命周期有限甩骏,可以在用完以后刪掉他們窗市。
Feature 功能分支
Feature(功能) 分支,有時(shí)候也叫 Topic 分支饮笛。在這種分支上去開(kāi)發(fā)新的功能咨察。當(dāng)開(kāi)發(fā)功能的時(shí)候,這個(gè)功能屬于哪個(gè)目標(biāo)發(fā)行還不知道福青。功能如果一直在開(kāi)發(fā)摄狱,對(duì)應(yīng)的這個(gè)功能分支就可以一直存在,不過(guò)到最后還是要合并到 develop 分支上无午,或者如果不想要開(kāi)發(fā)的這個(gè)功能了媒役,可以直接扔掉它。
![](http://i.imgur.com/qHg81ld.png)
功能名字的命名已經(jīng)在上文中有提到指厌。
創(chuàng)建一個(gè)功能分支:
git checkout -b feature-x develop
開(kāi)發(fā)完成后刊愚,將功能分支合并到develop分支:
git checkout develop
git merge --no-ff feature-x
刪除feature分支:
git branch -d feature-x## Release 預(yù)發(fā)布分支
它是指發(fā)布正式版本之前(即合并到Master分支之前),我們可能需要有一個(gè)預(yù)發(fā)布的版本進(jìn)行測(cè)試踩验。預(yù)發(fā)布分支是從Develop分支上面分出來(lái)的鸥诽,預(yù)發(fā)布結(jié)束以后商玫,必須合并進(jìn)Develop和Master分支。它的命名牡借,可以采用release-*的形式拳昌。
創(chuàng)建一個(gè)預(yù)發(fā)布分支:
git checkout -b release-1.2 develop
確認(rèn)沒(méi)有問(wèn)題后,合并到master分支:
git checkout master
git merge --no-ff release-1.2
#對(duì)合并生成的新節(jié)點(diǎn)钠龙,做一個(gè)標(biāo)簽
git tag -a 1.2
再合并到develop分支:
git checkout develop
git merge --no-ff release-1.2
最后炬藤,刪除預(yù)發(fā)布分支:
git branch -d release-1.2
Fixbug 修補(bǔ)bug分支
最后一種是修補(bǔ)bug分支。軟件正式發(fā)布以后碴里,難免會(huì)出現(xiàn)bug沈矿。這時(shí)就需要?jiǎng)?chuàng)建一個(gè)分支,進(jìn)行bug修補(bǔ)咬腋。 修補(bǔ)bug分支是從Master分支上面分出來(lái)的羹膳。修補(bǔ)結(jié)束以后,再合并進(jìn)Master和Develop分支根竿。它的命名陵像,可以采用fixbug-*的形式。
創(chuàng)建一個(gè)修補(bǔ)bug分支:
git checkout -b fixbug-0.1 master
修補(bǔ)結(jié)束后寇壳,合并到master分支:
git checkout master
git merge --no-ff fixbug-0.1
git tag -a 0.1.1
再合并到develop分支:
git checkout develop
git merge --no-ff fixbug-0.1
最后醒颖,刪除"修補(bǔ)bug分支":
git branch -d fixbug-0.1
![](http://i.imgur.com/ay7sfi8.png)