徐婭
摘 要:在大型團(tuán)隊(duì)協(xié)作項(xiàng)目中,對源代碼和文檔進(jìn)行版本控制是有必要的,本文對版本控制以及Git如何在團(tuán)隊(duì)協(xié)作中使用進(jìn)行了探討。
關(guān)鍵詞: Git;版本控制;團(tuán)隊(duì)協(xié)作
【Abstract】 In large-scale team collaborative projects, it is necessary to realize version control of the source code and documents. This paper discusses version control and the use mode of ?Git in team collaboration.
【Key words】 ?Git; version control; team collaboration
0 引 言
隨著社會(huì)發(fā)展與科技進(jìn)步,軟件的功能漸趨復(fù)雜,在一個(gè)軟件項(xiàng)目開發(fā)的過程中,團(tuán)隊(duì)協(xié)作必不可少。因?yàn)閳F(tuán)隊(duì)的每個(gè)成員有著不同的興趣和擅長的領(lǐng)域,所有的工作都需要分工并行,這種情況下就需要一種技術(shù)。該技術(shù)可以跟蹤和記錄每位團(tuán)隊(duì)成員對文檔與代碼的更改,輔助團(tuán)隊(duì)成員進(jìn)行多個(gè)版本分支的協(xié)同開發(fā)及維護(hù),最終合并到主分支進(jìn)行部署和發(fā)布。此種技術(shù)就是版本控制技術(shù),而Git就是一種版本控制工具。
1 ?版本控制
1.1 版本控制簡介
版本的概念最早在印刷行業(yè)出現(xiàn),由于編輯、印刷不同而衍生出不同樣式和內(nèi)容,產(chǎn)生了不同的成品,這就是版本。版本控制技術(shù)是一種可以記錄一個(gè)或多個(gè)文件在修改過程中的變化,使得后續(xù)可以查閱文件的歷史版本的技術(shù)。當(dāng)一個(gè)項(xiàng)目的代碼量達(dá)到一定規(guī)模時(shí),對源代碼的管理難度和重要性也會(huì)隨即增加。使用版本控制可以有效地管理和維護(hù)軟件的項(xiàng)目開發(fā),因其保存了從項(xiàng)目研發(fā)開始到結(jié)束的所有歷史提交和修改記錄。
1.2 版本控制操作
在一個(gè)項(xiàng)目從開始需求分析起,歷經(jīng)設(shè)計(jì)、代碼實(shí)現(xiàn)、測試和維護(hù)的所有環(huán)節(jié)的整個(gè)過程中,會(huì)產(chǎn)生不同版本的源代碼和文檔,此時(shí)可以對不同版本進(jìn)行一系列操作,對此可做探討分述如下。
(1)版本生成。在團(tuán)隊(duì)協(xié)作的過程中,每位成員可以將自己修改好的文件生成一個(gè)新的版本。
(2)版本提交。生成后的版本可以提交到遠(yuǎn)程,但需要進(jìn)行合并沖突的審核。
(3)版本審核。團(tuán)隊(duì)成員可能對文件的同一處內(nèi)容進(jìn)行了修改,這個(gè)時(shí)候文件的合并就會(huì)產(chǎn)生沖突,因此要進(jìn)行版本審核。
(4)版本修改。提交的版本若是沒有通過審核,則要進(jìn)行修改。
(5)版本提取。如果版本的修改發(fā)生了錯(cuò)誤,就要恢復(fù)到之前的版本,此時(shí)可以使用版本提取,恢復(fù)為版本之前的狀態(tài)。
(6)版本比較。在合并版本的過程中,常常需要對版本進(jìn)行比較,來選取一個(gè)最佳版本進(jìn)行恢復(fù)。比較的方式有2種。一種是通過時(shí)間進(jìn)行比較,一種是通過空間進(jìn)行比較。其中,通過時(shí)間進(jìn)行比較是指用戶可以對比不同時(shí)間發(fā)布的修改內(nèi)容,通過空間進(jìn)行比較是指比較版本的不同分支。
(7)版本合并。對于同一個(gè)文件,不同的團(tuán)隊(duì)成員可能會(huì)產(chǎn)生各自的修改,因而可以將處于不同分支的成員的修改進(jìn)行合并。
1.3 版本控制的優(yōu)勢
(1)方便代碼管理。版本控制技術(shù)可以避免代碼被項(xiàng)目組其它成員無意間覆蓋,還可以避免代碼的遺失。版本控制技術(shù)可以對不同版本進(jìn)行跟蹤、記錄和標(biāo)識(shí),也可以恢復(fù)到用戶所需的版本。
(2)自動(dòng)化。傳統(tǒng)的版本管理可以采用如下方法:將自己的文件生成一個(gè)副本,將改動(dòng)的時(shí)間點(diǎn)保存,并加上一個(gè)版本號,這種形式雖然方便,但是效率低下,因?yàn)椴煌募膬?nèi)容十分接近,不易找出兩者之間的差異,如果通過人工記憶多個(gè)版本之間的差異,一段時(shí)間后也容易產(chǎn)生混淆,而版本控制可以做到版本之間差異的自動(dòng)化比較,無需人工進(jìn)行查找。另外,在解決沖突時(shí),如果沒有版本控制工具,每一位成員需要自己對沖突文檔予以逐行查閱,這大大增加了工作量,并且在修改的過程中若是不慎還容易帶來新的問題,因此版本控制在解決沖突時(shí)也更為方便。
(3)實(shí)現(xiàn)了分工和并行??臻g上統(tǒng)一管理,時(shí)間上全程記錄。版本控制技術(shù)對團(tuán)隊(duì)協(xié)作項(xiàng)目的開發(fā)有輔助作用,一個(gè)大型的軟件項(xiàng)目的任務(wù)往往是分工并行協(xié)作的,需要多個(gè)人同時(shí)修改一個(gè)文件,而版本控制技術(shù)實(shí)現(xiàn)了團(tuán)隊(duì)成員任務(wù)在不同地域的同步開發(fā),突破了時(shí)間和空間的局限,因此大大縮短了項(xiàng)目開發(fā)的周期,提高了項(xiàng)目研發(fā)的效率。
(4)訪問控制??梢宰柚刮唇?jīng)授權(quán)的更改和查看。如果所有的成員都可以不受任何限制地進(jìn)行代碼的添加、修改和刪除操作,沒有明確的代碼管理人,將會(huì)帶來嚴(yán)重的后果。
1.4 版本控制系統(tǒng)分類
版本控制系統(tǒng)分為2類。一類是集中式版本控制系統(tǒng),另一類是分布式版本控制系統(tǒng)。其中,集中式版本控制系統(tǒng)是指軟件項(xiàng)目的所有代碼的修改和提交都存儲(chǔ)在一臺(tái)中央服務(wù)器,本地的版本控制系統(tǒng)只保存最新的文件快照,所以每位開發(fā)人員在開始工作前,必須要從中央服務(wù)器同步最新的項(xiàng)目版本數(shù)據(jù)信息來避免版本沖突。集中式版本控制系統(tǒng)的缺點(diǎn)就是對中央服務(wù)器的依賴性很高,中央服務(wù)器的單點(diǎn)故障將會(huì)帶來嚴(yán)重的后果。如果中央服務(wù)器出現(xiàn)宕機(jī),所有人都無法進(jìn)行文件更新的提交;如果中央服務(wù)器的硬盤出現(xiàn)損壞,那么就可能永久性地丟失所有的存儲(chǔ)信息。與集中式版本控制系統(tǒng)相對應(yīng)的是分布式版本控制系統(tǒng),這是指每個(gè)參與者都在本地有自己的版本庫,而且也沒有中央服務(wù)器,對代碼的修改信息除了保存在遠(yuǎn)程倉庫,每個(gè)參與者在本地都有自己的一份完整的鏡像文件,即使服務(wù)器出現(xiàn)了巨大的損壞,也可以通過鏡像文件進(jìn)行恢復(fù),而且,同時(shí)也支持著離線工作。
1.5 Git
Git是一種典型的分布式版本控制系統(tǒng),為了更好地管理Linux內(nèi)核,在2005年由Linus Torvalds首次提出。Git具有使用簡便、開源、速度快、保護(hù)數(shù)據(jù)完整性的特點(diǎn),并且提供了對非線性開發(fā)模式的支持,有強(qiáng)大的分支管理能力,允許上千個(gè)分支同步并行開發(fā),分支的開發(fā)不影響主分支。首先,軟件項(xiàng)目的開發(fā)過程可能會(huì)經(jīng)常出現(xiàn)功能和性能上的問題,漏洞是可追溯的,出現(xiàn)在某些版本中。使用Git的分支管理功能,通過檢查不同版本,定位版本的漏洞的位置,再對這個(gè)版本的漏洞進(jìn)行修復(fù)。其次,可以利用一個(gè)新的創(chuàng)建分支對軟件進(jìn)行測試性修改,用來驗(yàn)證本文設(shè)計(jì)的新算法是否可以讓文中的軟件項(xiàng)目給用戶帶來更好的使用體驗(yàn),最后,可以利用Git的分支管理功能在不同的分支上給軟件設(shè)計(jì)不同的功能,因此各個(gè)功能相互獨(dú)立,如果后續(xù)研發(fā)中不再需要此項(xiàng)功能,可以回退到之前的版本,其它的功能分支也不會(huì)因此受到影響。Git采用快照模式,也就是說Git記錄數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)的映像,而不是記錄提交前后數(shù)據(jù)的具體差異,并且采用校驗(yàn)和壓縮,因此恢復(fù)起文件來要更為快速。Git再通過SHA-1算法對數(shù)據(jù)內(nèi)容進(jìn)行校驗(yàn)和計(jì)算,并將結(jié)果作為數(shù)據(jù)唯一的標(biāo)識(shí),所以,Git可以檢測得到任何數(shù)據(jù)的修改和刪除,這保證了數(shù)據(jù)的完整性。Git憑借自身的卓越性能,已廣泛地應(yīng)用于眾多的著名開源項(xiàng)目,如Ruby on Rails、Perl、Eclipse等,是大型項(xiàng)目開發(fā)的首選工具。
1.6 Gitee
目前,隨著版本控制系統(tǒng)的不斷發(fā)展和完善,產(chǎn)生了品類眾多的衍生品,其中之一就是代碼托管平臺(tái)。人們可以在代碼托管平臺(tái)上對代碼進(jìn)行下載,也可以將自己的代碼交付給代碼托管平臺(tái)進(jìn)行托管。比較著名的代碼托管平臺(tái)有GitHub和Gitee,Gitee又叫碼云,是由開源中國社區(qū)在2013年推出的基于Git的代碼免費(fèi)托管服務(wù)。該服務(wù)基于GitLab、且又在其基礎(chǔ)上做了大量的改進(jìn)和定制開發(fā),而與GitHub比起來則擁有更快的訪問速度,當(dāng)前的開發(fā)者超過 300 萬,托管項(xiàng)目超過 500萬,匯聚了本土的幾乎所有原創(chuàng)開源項(xiàng)目,并于 2016 年推出企業(yè)版,提供企業(yè)級代碼托管服務(wù),成為開發(fā)領(lǐng)域領(lǐng)先的 SaaS 服務(wù)提供商,也是目前國內(nèi)最大的代碼托管系統(tǒng)。Gitee除了提供最基礎(chǔ)的代碼托管之外,還提供代碼在線查看、歷史版本查看、Fork、Pull Request、打包下載任意版本、Issue、Wiki、保護(hù)分支、代碼質(zhì)量檢測、PaaS項(xiàng)目演示等方便管理、開發(fā)、協(xié)作、共享的功能。對于一個(gè)開發(fā)者來說,一個(gè)代碼托管平臺(tái)必不可少,在使用Git進(jìn)行團(tuán)隊(duì)協(xié)作項(xiàng)目的版本管理時(shí),也需要和團(tuán)隊(duì)其它成員共同使用Gitee來對項(xiàng)目的倉庫進(jìn)行管理。
2 Git在團(tuán)隊(duì)協(xié)作中的使用
2.1 使用過程
(1)每一位團(tuán)隊(duì)成員進(jìn)入Gitee官網(wǎng)(https://www.gitee.com/)注冊一個(gè)賬號,并生成自己的SSH Key。
(2)團(tuán)隊(duì)中一位成員git init在本地建立項(xiàng)目倉庫,并使用git remote add origin git將遠(yuǎn)程倉庫和本地倉庫相關(guān)聯(lián)。將其它成員的SSH Key添加到Gitee。
(3)團(tuán)隊(duì)中的其它成員使用git clone命令將遠(yuǎn)程倉庫的項(xiàng)目復(fù)制到本地,可使用多種網(wǎng)絡(luò)協(xié)議,如SSH 協(xié)議、https協(xié)議。研究可知,SSH協(xié)議的速度最快。
(4)對項(xiàng)目文件進(jìn)行修改,將只會(huì)限定在自己的分支上,使用git commit在本地進(jìn)行提交,這樣就把修改保存到了暫存區(qū),如果是暫存區(qū)還沒有的文件,則需要使用git add將項(xiàng)目文件先添加到暫存區(qū)。
(5)使用git push命令將暫存區(qū)的文件推送到遠(yuǎn)程倉庫。如果團(tuán)隊(duì)的其它成員在遠(yuǎn)程分支上有了更新的提交,則需要使用git pull將屬于同一項(xiàng)目的遠(yuǎn)端倉庫與同樣屬于同一項(xiàng)目的本地倉庫進(jìn)行合并,該過程包含了2個(gè)操作:從遠(yuǎn)端倉庫中取出更新版本,再合并到本地倉庫。如果合并發(fā)生了沖突,則先解決沖突并在本地提交。
(6)每位個(gè)體的工作應(yīng)避免直接在主分支上展開,當(dāng)每個(gè)人的項(xiàng)目有必要加以合并時(shí)進(jìn)行分支合并,發(fā)布這個(gè)版本,這個(gè)版本是較為穩(wěn)定的。
2.2 協(xié)作過程中的沖突解決和避免
代碼沖突是多人協(xié)作開發(fā)過程中最常見的問題,一旦解決不當(dāng),會(huì)引發(fā)代碼丟失或者業(yè)務(wù)功能異常等問題,所以在系統(tǒng)功能設(shè)計(jì)上,要做到功能解耦,并且在不同的文件中實(shí)現(xiàn)不同的功能。Git會(huì)提示合并發(fā)生了沖突,此時(shí)可以得知發(fā)生沖突的文件,Git還會(huì)通過不同的符號來標(biāo)記不同分支的內(nèi)容,故而用戶將需要手動(dòng)解決沖突。在開發(fā)過程中,也要培養(yǎng)良好的開發(fā)習(xí)慣,如果必須面臨多位成員同時(shí)修改一個(gè)文件的情況,則每一位成員要定期執(zhí)行Git pull命令,如果出現(xiàn)了沖突則要盡早解決,隨著沖突解決時(shí)間的延長,沖突解決的難度也會(huì)隨之增大。
2.3 不同團(tuán)隊(duì)人數(shù)的協(xié)作模式探討
在不同的團(tuán)隊(duì)人數(shù)下,可以采用不同的協(xié)作模式。當(dāng)團(tuán)隊(duì)人數(shù)為2時(shí),如果2個(gè)人中有一個(gè)人A為主要開發(fā)者,另外一個(gè)人B為輔助者,假設(shè)A的機(jī)器地址為a,B的機(jī)器地址為b,項(xiàng)目的倉庫建立在A 的機(jī)器上,2個(gè)人的工作在A的機(jī)器上合并,則B可以通過git clone將遠(yuǎn)程倉庫的項(xiàng)目復(fù)制到本地,而A 執(zhí)行g(shù)it pull b將遠(yuǎn)程倉庫合并到本地。但當(dāng)團(tuán)隊(duì)人數(shù)為3及以上時(shí),假設(shè)第三位開發(fā)者為C,機(jī)器地址為c,如果C和B采取一樣的操作,則A需要執(zhí)行g(shù)it pull c和git pull c命令將倉庫合并,此時(shí)A的工作量相對較大。如是A只負(fù)責(zé)本地倉庫,而B和C先執(zhí)行g(shù)it pull a,再執(zhí)行g(shù)it push,則B和C的工作量較大,因此較為合適的方法就是將項(xiàng)目倉庫建立在實(shí)驗(yàn)室的服務(wù)器上,A通過SSH登錄服務(wù)器后,建立一個(gè)目錄,初始化一個(gè)空倉庫,并將自己本地已經(jīng)接受git管理的倉庫推送到遠(yuǎn)程,B和C再通過git clone將遠(yuǎn)程倉庫的項(xiàng)目復(fù)制到本地,則服務(wù)器上的倉庫會(huì)記錄每一位用戶涉及的版本更新提交,因此,提取和推送的工作并不會(huì)總是由一人或兩個(gè)人來進(jìn)行。綜上可知,這種模式分擔(dān)了團(tuán)隊(duì)其它成員的工作量。
3 結(jié)束語
在團(tuán)隊(duì)協(xié)作項(xiàng)目中,使用Git進(jìn)行版本控制,減少了開發(fā)者大量不必要的工作,可以對項(xiàng)目進(jìn)行高效的管理。如果沒有版本控制工具,任何一種不可逆的操作都會(huì)給版本的回退帶來困難。Git保證了版本的可溯性,并且可以在某個(gè)版本的測試和使用的過程中出現(xiàn)問題時(shí)可以盡早定位問題發(fā)生的時(shí)間節(jié)點(diǎn)、原因和負(fù)責(zé)人。一個(gè)復(fù)雜的項(xiàng)目常常會(huì)遇到頻繁地修改源代碼的場景,使用Git進(jìn)行版本控制可以有針對性地解決源代碼混亂的問題。Git分布式特性和分支管理能力使得大型軟件項(xiàng)目尤為適合使用Git,每個(gè)分支彼此獨(dú)立,互不影響。Git免費(fèi)、開源的特點(diǎn)正吸引著來自世界各地的大量優(yōu)秀開發(fā)人才。Git有著可觀的應(yīng)用潛力,而且勢必會(huì)不斷地趨于成熟與完善。
參考文獻(xiàn)
[1]秦佳. 軟件配置管理中版本控制的研究[J]. 軟件,2019,40(3):137-139.
[2]李志杰. 版本控制技術(shù)在團(tuán)隊(duì)協(xié)同開發(fā)中的應(yīng)用研究[J]. 現(xiàn)代商貿(mào)工業(yè),2012(14):168-169.
[3]朱守園,王婷. 基于GIT的軟件開發(fā)模式探究[J]. 信息通信,2017(3):117-118.
[4]字鳳芹. 基于Git的協(xié)作小組學(xué)習(xí)資源庫的建設(shè)與研究[D]. 昆明:云南大學(xué),2016.
[5]王遠(yuǎn). 基于MFS的校園安全同步網(wǎng)盤設(shè)計(jì)與實(shí)現(xiàn)[D]. 長沙:國防科學(xué)技術(shù)大學(xué),2013.
[6]諸葛文社.Git倉庫代碼演化過程中的注解定位技術(shù)研究[D].南京:南京郵電大學(xué),2018.