田江濤
摘要??? 在軟件開發(fā)過程中,經(jīng)常使用并行開發(fā)的方式,即將同一個(gè)項(xiàng)目分配給不同的人來完成,每個(gè)人負(fù)責(zé)其中的一個(gè)模塊,等所有人都完成后,再進(jìn)行整合。最后整合面臨的問題是需要選出一個(gè)人來進(jìn)行專門整合,此時(shí)的工作量會(huì)非常的龐大。本文介紹了git,svn等scm軟件的區(qū)別,并結(jié)合實(shí)際場(chǎng)景,介紹了使用git工具,在一個(gè)簡(jiǎn)單的gitflow下,并行開發(fā)的場(chǎng)景。希望能夠幫助其它開發(fā)人員使用git工具來進(jìn)行類似的工作。
【關(guān)鍵詞】軟件開發(fā) git
1 git及其它工具介紹
git是版本管理工具的一種,它是分布式的,每一個(gè)git repo都是包含了完整的信息和數(shù)據(jù),開發(fā)者完全可以在本地進(jìn)行開發(fā),無需網(wǎng)絡(luò)連接。git工具的最大特點(diǎn)是多分支,可以支持多分支開發(fā),這為多分支并行開發(fā)提供了基礎(chǔ)。
相比git,SVN是集中式版本控制系統(tǒng),所有代碼集中存放在中央服務(wù)器中,SVN最大的缺點(diǎn)是必須聯(lián)網(wǎng)才能工作,而且會(huì)受網(wǎng)絡(luò)速度的限制。另外集中式版本控制系統(tǒng)依賴于中央服務(wù)器,假如服務(wù)器宕機(jī)了,任何人都無法提交代碼。并且SVN的分支相對(duì)git要弱得多。
其它類似的SCM比如,Mercurial和Bazaar還有微軟的VCS,但是使用最多最廣,功能最為強(qiáng)大的還是git。
git的分支:
master:主分支,當(dāng)前分支上的代碼隨時(shí)可以直接發(fā)布,并且只能通過Pull Request從其他分支進(jìn)行合并,而不能直接push修改。當(dāng)開發(fā)告一段落,產(chǎn)生了新的可供發(fā)布的代碼時(shí),master分支通過Pull Request更新了代碼。
develop:開發(fā)分支,保存當(dāng)前最新開發(fā)成果的分支,即當(dāng)一個(gè)新功能開發(fā)完畢需要先合并到develop分支,這個(gè)分支的代碼會(huì)進(jìn)行每日的代碼持續(xù)集成。所有的開發(fā)任務(wù)都是從這個(gè)分支Checkout新的特性分支進(jìn)行開發(fā)。
feature:特性分支,當(dāng)開發(fā)新的功能時(shí),從develop分支Checkout新的feature分支,這個(gè)分支的代碼最終要合并回develop分支或者廢棄掉。feature分支通常以功能為單位。
2 git,gitlab和gitflow
git的功能是非常強(qiáng)大的,但是使用它有一定的難度,尤其是要分清git,gitlab,gitflow的區(qū)別。
git如前所述,就是一個(gè)基礎(chǔ)工具,如果在linux如紅帽或者是centos下,yum install git就能安裝這個(gè)工具,但是這個(gè)工具只具有基礎(chǔ)的功能,是基于命令行的,用戶管理等待其它功能基本沒有,只使用這個(gè)linux下的git來進(jìn)行開發(fā)管理還是有以難度的。
所以有了gitlab,這個(gè)是基于git的web管理工具,使用它有友好的界面和完備的管理各種管理功能,甚至還集成了CI/CD功能,使用gitlab來管理開發(fā)工作會(huì)非常方便,最難得是它支持在內(nèi)網(wǎng)部署,這就為廣大開發(fā)者提供了一個(gè)強(qiáng)大的工具。類似的軟件還有g(shù)ogs。
而gitflow不同于前兩者,它是開發(fā)的流程和約定。
3 基于git工具建立并行開發(fā)上線流程
3.1 靈活的gitflow
我們的項(xiàng)目包含大約2000個(gè)獨(dú)立的小文件,對(duì)于這個(gè)項(xiàng)目的管理,我們使用如下的gitflow:
(1)設(shè)置開發(fā),測(cè)試和維護(hù)角色,并行工作,互不干涉。倉(cāng)庫(kù)設(shè)置develop和master分支,并禁止直接推送。
(2)每一個(gè)開發(fā)人員使用一個(gè)開發(fā)分支,分支名字不能重復(fù),開發(fā)完畢后上傳遠(yuǎn)程倉(cāng)庫(kù)。
(3)測(cè)試人員測(cè)試腳本通過后,將開發(fā)分支合并到develop并刪除此分支。
(4)維護(hù)人員定期合并develop和master分支,并將項(xiàng)目同步到服務(wù)器。
上述的gitflow提供了并行開發(fā)的管理流程,并且能最大可能的避免沖突的產(chǎn)生,這樣的并行開發(fā)上線效率將大大的優(yōu)于串行開發(fā)的效率。
3.2開發(fā)過程
將項(xiàng)目托管到gogs服務(wù)器上,將它作為遠(yuǎn)程倉(cāng)庫(kù),并建立兩個(gè)分支:master分支(穩(wěn)定生產(chǎn)版),develop分支(測(cè)試完成版),然后開發(fā)人員根據(jù)不同的任務(wù),建立本地分支,在該分支上進(jìn)行開發(fā),工作完成后將代碼push到develop分支上,假如有沖突,則要先解決沖突,而后再次將代碼push到develop分支上。具體流程如下:
(1)首先在電腦上安裝TortoiseGit:可以從Git官網(wǎng)直接下載安裝程序,然后按默認(rèn)選項(xiàng)安裝即可。
(2)將代碼下載到本地,如果本地已經(jīng)有代碼則直接進(jìn)入下一步:
Git clone http://133.96.72.138:30000/tianjiangtao/2017GS.git
(3)在本地進(jìn)行常規(guī)開發(fā),可使用vscode進(jìn)行開發(fā),增加、修改、刪除文件等等操作。
更改目錄:cd 2017GS;
切換分支到develop(開發(fā)分支):git checkout develop;
查看分支:git branch-a;
創(chuàng)建自己的dev分支(dev名稱可以任意?。篻it branch dev;
切換到dev分支:git checkout dev;添加修改:git add *;
(4)在本地開發(fā)工作告一段落,需要把本地代碼推送(Push)到遠(yuǎn)程分支上,提交變更及增加新的分支,服務(wù)端如果無分支,就在遠(yuǎn)端創(chuàng)建:git push--set-upstream origin dev。
提交后會(huì)與遠(yuǎn)程庫(kù)進(jìn)行一次同步,最終清理掉版本庫(kù)中的dev分支,但本地工作區(qū)中的dev分支并不會(huì)刪除:git remote prune origin。
(5)如果其他人已經(jīng)向dev分支推送了他的提交,而你也對(duì)同樣的文件作了修改,在推送的時(shí)候會(huì)提示推送失敗,因?yàn)樗淖钚绿峤缓湍阍噲D推送的提交有沖突。解決辦法很簡(jiǎn)單:先用git pull把最新的提交從dev拖下來,然后,在本地合并解決沖突,再推送到遠(yuǎn)程倉(cāng)庫(kù)。
4 結(jié)語(yǔ)
綜上所述,基于git的并行開發(fā)上線流程,可以實(shí)現(xiàn)團(tuán)隊(duì)內(nèi)的有效合作,提高工作效率,避免資源浪費(fèi)。版本庫(kù)本地化,支持離線提交,相對(duì)獨(dú)立不影響協(xié)同開發(fā)。每個(gè)開發(fā)者都擁有自己的版本控制庫(kù),在自己的版本庫(kù)上可以任意的執(zhí)行提交代碼、創(chuàng)建分支等行為。更少的“倉(cāng)庫(kù)污染”。git對(duì)于每個(gè)工程只會(huì)產(chǎn)生一個(gè) .git目錄,這個(gè)工程所有的版本控制信息都在這個(gè)目錄中。