Git Flow 是什么
Git Flow是構(gòu)建在Git之上的一個組織軟件開發(fā)活動的模型掏导,是在Git之上構(gòu)建的一項軟件開發(fā)最佳實踐芥炭。Git Flow是一套使用Git進行源代碼管理時的一套行為規(guī)范和簡化部分Git操作的工具漓库。
2010年5月,在一篇名為“一種成功的Git分支模型”的博文中园蝠,@nvie介紹了一種在Git之上的軟件開發(fā)模型渺蒿。通過利用Git創(chuàng)建和管理分支的能力,為每個分支設(shè)定具有特定的含義名稱彪薛,并將軟件生命周期中的各類活動歸并到不同的分支上蘸嘶。實現(xiàn)了軟件開發(fā)過程不同操作的相互隔離。這種軟件開發(fā)的活動模型被nwie稱為“Git Flow”陪汽。
一般而言训唱,軟件開發(fā)模型有常見的瀑布模型、迭代開發(fā)模型挚冤、以及最近出現(xiàn)的敏捷開發(fā)模型等不同的模型况增。每種模型有各自應(yīng)用場景。Git Flow重點解決的是由于源代碼在開發(fā)過程中的各種沖突導(dǎo)致開發(fā)活動混亂的問題训挡。因此澳骤,Git flow可以很好的于各種現(xiàn)有開發(fā)模型相結(jié)合使用。
在開始研究Git Flow的具體內(nèi)容前澜薄,下面這張圖可以看到模型的全貌(引自nvie的博文):
Git Flow中的分支
Git Flow模型中定義了主分支和輔助分支兩類分支为肮。其中主分支用于組織與軟件開發(fā)、部署相關(guān)的活動肤京;輔助分支組織為了解決特定的問題而進行的各種開發(fā)活動颊艳。
主分支
主分支是所有開發(fā)活動的核心分支。所有的開發(fā)活動產(chǎn)生的輸出物最終都會反映到主分支的代碼中忘分。主分支分為master分支和development分支棋枕。
master分支
master分支上存放的應(yīng)該是隨時可供在生產(chǎn)環(huán)境中部署的代碼(Production Ready state)。當(dāng)開發(fā)活動告一段落妒峦,產(chǎn)生了一份新的可供部署的代碼時重斑,master分支上的代碼會被更新。同時肯骇,每一次更新窥浪,最好添加對應(yīng)的版本號標(biāo)簽(TAG)。
develop分支
develop分支是保存當(dāng)前最新開發(fā)成果的分支笛丙。通常這個分支上的代碼也是可進行每日夜間發(fā)布的代碼(Nightly build)漾脂。因此這個分支有時也可以被稱作“integration branch”。
當(dāng)develop分支上的代碼已實現(xiàn)了軟件需求說明書中所有的功能若债,通過了所有的測試后符相,并且代碼已經(jīng)足夠穩(wěn)定時,就可以將所有的開發(fā)成果合并回master分支了。對于master分支上的新提交的代碼建議都打上一個新的版本號標(biāo)簽(TAG)啊终,供后續(xù)代碼跟蹤使用镜豹。
因此,每次將develop分支上的代碼合并回master分支時蓝牲,我們都可以認(rèn)為一個新的可供在生產(chǎn)環(huán)境中部署的版本就產(chǎn)生了趟脂。通常而言,“僅在發(fā)布新的可供部署的代碼時才更新master分支上的代碼”是推薦所有人都遵守的行為準(zhǔn)則例衍∥羝冢基于此,理論上說佛玄,每當(dāng)有代碼提交到master分支時硼一,我們可以使用Git Hook觸發(fā)軟件自動測試以及生產(chǎn)環(huán)境代碼的自動更新工作。這些自動化操作將有利于減少新代碼發(fā)布之后的一些事務(wù)性工作梦抢。
輔助分支
輔助分支是用于組織解決特定問題的各種軟件開發(fā)活動的分支般贼。輔助分支主要用于組織軟件新功能的并行開發(fā)、簡化新功能開發(fā)代碼的跟蹤奥吩、輔助完成版本發(fā)布工作以及對生產(chǎn)代碼的缺陷進行緊急修復(fù)工作哼蛆。這些分支與主分支不同,通常只會在有限的時間范圍內(nèi)存在霞赫。
輔助分支包括:
用于開發(fā)新功能時所使用的feature分支腮介;
用于輔助版本發(fā)布的release分支;
用于修正生產(chǎn)代碼中的缺陷的hotfix分支端衰。
以上這些分支都有固定的使用目的和分支操作限制叠洗。從單純技術(shù)的角度說,這些分支與Git其他分支并沒有什么區(qū)別靴迫,但通過命名惕味,我們定義了使用這些分支的方法楼誓。
feature分支
使用規(guī)范:
可以從develop分支發(fā)起feature分支
代碼必須合并回develop分支
feature分支的命名可以使用除master
,develop
,release-*
霜大,hotfix-*
之外的任何名稱
feature分支(有時也可以被叫做“topic分支”)通常是在開發(fā)一項新的軟件功能的時候使用围橡,這個分支上的代碼變更最終合并回develop分支或者干脆被拋棄掉(例如實驗性且效果不好的代碼變更)。
一般而言榄融,feature分支代碼可以保存在開發(fā)者自己的代碼庫中而不強制提交到主代碼庫里参淫。
release分支
使用規(guī)范:
可以從develop分支派生
必須合并回develop分支和master分支
分支命名慣例:release-*
release分支是為發(fā)布新的產(chǎn)品版本而設(shè)計的。在這個分支上的代碼允許做小的缺陷修正愧杯、準(zhǔn)備發(fā)布版本所需的各項說明信息(版本號涎才、發(fā)布時間、編譯時間等等)。通過在release分支上進行這些工作可以讓develop分支空閑出來以接受新的feature分支上的代碼提交耍铜,進入新的軟件開發(fā)迭代周期邑闺。
當(dāng)develop分支上的代碼已經(jīng)包含了所有即將發(fā)布的版本中所計劃包含的軟件功能,并且已通過所有測試時棕兼,我們就可以考慮準(zhǔn)備創(chuàng)建release分支了陡舅。而所有在當(dāng)前即將發(fā)布的版本之外的業(yè)務(wù)需求一定要確保不能混到release分支之內(nèi)(避免由此引入一些不可控的系統(tǒng)缺陷)。
成功的派生了release分支伴挚,并被賦予版本號之后靶衍,develop分支就可以為“下一個版本”服務(wù)了。所謂的“下一個版本”是在當(dāng)前即將發(fā)布的版本之后發(fā)布的版本茎芋。版本號的命名可以依據(jù)項目定義的版本號命名規(guī)則進行颅眶。
hotfix分支
使用規(guī)范:
可以從master分支派生
必須合并回master分支和develop分支
分支命名慣例:hotfix-*
除了是計劃外創(chuàng)建的以外,hotfix分支與release分支十分相似:都可以產(chǎn)生一個新的可供在生產(chǎn)環(huán)境部署的軟件版本田弥。
當(dāng)生產(chǎn)環(huán)境中的軟件遇到了異常情況或者發(fā)現(xiàn)了嚴(yán)重到必須立即修復(fù)的軟件缺陷的時候帚呼,就需要從master分支上指定的TAG版本派生hotfix分支來組織代碼的緊急修復(fù)工作。
這樣做的顯而易見的好處是不會打斷正在進行的develop分支的開發(fā)工作皱蹦,能夠讓團隊中負(fù)責(zé)新功能開發(fā)的人與負(fù)責(zé)代碼緊急修復(fù)的人并行的開展工作煤杀。
更進一步
Git Flow開發(fā)模型從源代碼管理角度對通常意義上的軟件開發(fā)活動進行了約束。應(yīng)該說沪哺,為我們的軟件開發(fā)提供了一個可供參考的管理模型沈自。Git Flow開發(fā)模型讓nvie的開發(fā)代碼倉庫保持整潔,讓小組各個成員之間的開發(fā)相互隔離辜妓,能夠有效避免處于開發(fā)狀態(tài)中的代碼相互影響而導(dǎo)致的效率低下和混亂枯途。
所謂模型,在不同的開發(fā)團隊籍滴,不同的文化酪夷,不同的項目背景情況下都有可能需要進行適當(dāng)?shù)牟眉艋驍U充。祝各位好運孽惰!
PS:為了簡化使用Git Flow模型時Git指令的復(fù)雜性晚岭,nvie開發(fā)出了一套git增強指令集⊙Γ可以運行于Windows坦报、Linux、Unix和Mac操作系統(tǒng)之下狂鞋。有興趣的同學(xué)可以去看看片择。
附錄
安裝Git Flow
Git Flow的在不同的操作系統(tǒng)之下有一些輕微的不同。好在nvie給出了詳細的指導(dǎo)骚揍。
Windows
配合Cygwin使用字管。Cygwin之下的安裝非常簡單。執(zhí)行如下指令即可:
wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash
使用這條命令在大多數(shù)情況下都可以完成Git Flow的安裝。但在少數(shù)情況下也會遇到異常:
執(zhí)行 git flow init 命令后出現(xiàn)錯誤:"flags: FATAL unable to determine getopt version"
需要使用Cygwin的Util-linux安裝包嘲叔。重新使用cywgin的setup安裝吧脐供。
如果出現(xiàn)類似"$'\r': command not found"的錯誤,則可能是換行符出現(xiàn)了問題借跪≌海可以使用sed命令來快速解決。
$ sed -i 's/\n\r/\n/mg' /usr/local/bin/git-flow$ sed -i 's/\n\r/\n/mg' /usr/local/bin/gitflow-