功能分支通常存在于開發(fā)者的軟件庫(kù),而不是在源代碼庫(kù)中。
創(chuàng)建一個(gè)功能分支
開始一項(xiàng)功能的開發(fā)工作時(shí),基于develop創(chuàng)建分支。
$ git checkout -b myfeature develop
Switched to a new branch "myfeature"
合并一個(gè)功能到develop分支
完成的功能可以合并進(jìn)develop分支,以明確加入到未來的發(fā)布:
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop
–no-ff標(biāo)志導(dǎo)致合并操作創(chuàng)建一個(gè)新commit對(duì)象,即使該合并操作可以fast-forward。這避免了丟失這個(gè)功能分支存在的歷史信息,將該功能的所有提交組合在一起。 比較:
后一種情況,不可能從Git歷史中看到哪些提交一起實(shí)現(xiàn)了一個(gè)功能——你必須手工閱讀全部的日志信息。如果對(duì)整個(gè)功能進(jìn)行回退 (比如一組提交),后一種方式會(huì)是一種真正頭痛的問題,而使用–no-ffflag的情況則很容易.
是的,它會(huì)創(chuàng)建一個(gè)新的(空)提交對(duì)象,但是收益遠(yuǎn)大于開銷。
不幸的是,我還沒找到一種方法,讓–no-ff時(shí)作為合并操作的默認(rèn)選項(xiàng),但它應(yīng)該是可行的。
Release 分支
Release分支可能從develop分支分離而來,但是一定要合并到develop和master分支上,它的習(xí)慣命名方式為:release-*。
Release分支是為新產(chǎn)品的發(fā)布做準(zhǔn)備的。它允許我們?cè)诤髸r(shí)刻做一些細(xì)小的修改。他們?cè)试S小bugs的修改和準(zhǔn)備發(fā)布元數(shù)據(jù)(版本號(hào),開發(fā)時(shí)間等等)。當(dāng)在Release分支完成這些所有工作以后,對(duì)于下一次打的發(fā)布,develop分支接收features會(huì)更加明確。
從develop分支創(chuàng)建新的Release分支的關(guān)鍵時(shí)刻是develop分支達(dá)到了發(fā)布的理想狀態(tài)。至少所有這次要發(fā)布的features必須在這個(gè)點(diǎn)及時(shí)合并到develop分支。對(duì)于所有未來準(zhǔn)備發(fā)布的features必須等到Release分支創(chuàng)建以后再合并。
在Release分支創(chuàng)建的時(shí)候要為即將發(fā)行版本分配一個(gè)版本號(hào),一點(diǎn)都不早。直到那時(shí),develop分支反映的變化都是為了下一個(gè)發(fā)行版,但是在Release分支創(chuàng)建之前,下一個(gè)發(fā)行版到底叫0.3還是1.0是不明確的。這個(gè)決定是在Release分支創(chuàng)建時(shí)根據(jù)項(xiàng)目在版本號(hào)上的規(guī)則制定的。
創(chuàng)建一個(gè)release分支
Release分支是從develop分支創(chuàng)建的。例如,當(dāng)前產(chǎn)品的發(fā)行版本號(hào)為1.1.5,同事我們有一個(gè)大的版本即將發(fā)行。develop 分支已經(jīng)為下次發(fā)行做好了準(zhǔn)備,我們得決定下一個(gè)版本是1.2(而不是1.1.6或者2.0)。所以我們將Release分支分離出來,給一個(gè)能夠反映新版本號(hào)的分支名。
$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)
創(chuàng)建新分支以后,切換到該分支,添加版本號(hào)。這里,bump-version.sh 是一個(gè)虛構(gòu)的shell腳本,它可以復(fù)制一些文件來反映新的版本(這當(dāng)然可以手動(dòng)改變–目的是修改一些文件)。然后版本號(hào)被提交。
這個(gè)新分支可能會(huì)存在一段時(shí)間,直到該發(fā)行版到達(dá)它的預(yù)定目標(biāo)。在此期間,bug的修復(fù)可能被提交到該分支上(而不是提交到develop分支上)。在這里嚴(yán)格禁止增加大的新features。他們必須合并到develop分支上,然后等待下一次大的發(fā)行版。
完成一個(gè)release分支
當(dāng)一個(gè)release分支準(zhǔn)備好成為一個(gè)真正的發(fā)行版的時(shí)候,有一些工作必須完成。首先,release分支要合并到master上(因?yàn)槊恳淮翁峤坏絤aster上的都是一個(gè)新定義的發(fā)行版,記住)。然后,提交到master上必須打一個(gè)標(biāo)簽,以便以后更加方便的引用這個(gè)歷史版本。后,在release分支上的修改必須合并到develop分支上,以便未來發(fā)行版也包含這些bugs的修復(fù)。