對(duì)于軟件開(kāi)發(fā)人員來(lái)說(shuō),版本控制系統(tǒng)他們?cè)偈煜げ贿^(guò)了,所謂版本控制系統(tǒng)就是軟件項(xiàng)目開(kāi)發(fā)過(guò)程中用于儲(chǔ)存開(kāi)發(fā)人員所寫代碼所有修訂版本的軟件。它的主要目的是實(shí)現(xiàn)開(kāi)發(fā)團(tuán)隊(duì)并行開(kāi)發(fā)童谒、提高開(kāi)發(fā)效率,對(duì)軟件開(kāi)發(fā)進(jìn)程中文件或目錄的發(fā)展過(guò)程提供有效的追蹤手段沪羔,保證在需要時(shí)可回到舊的版本饥伊,避免文件的丟失、修改的丟失和相互覆蓋蔫饰,從而減輕開(kāi)發(fā)人員的負(fù)擔(dān)撵渡,節(jié)省時(shí)間,同時(shí)降低人為錯(cuò)誤死嗦。而目前常見(jiàn)的版本控制系統(tǒng)分為集中式版本控制系統(tǒng)和分布式版本控制系統(tǒng)兩種。
SVN和Git
在集中式版本控制系統(tǒng)中粒氧,目前比較常用的是SVN越除,而說(shuō)起SVN就不能不談CVS,CVS是一個(gè)C/S系統(tǒng)外盯,主要在開(kāi)源軟件管理中使用摘盆。多個(gè)開(kāi)發(fā)人員通過(guò)一個(gè)中心版本控制系統(tǒng)來(lái)記錄文件版本,從而達(dá)到保證文件同步的目的饱苟。CVS版本控制系統(tǒng)是一種GNU軟件包孩擂,主要用于在多人開(kāi)發(fā)環(huán)境下的源碼的維護(hù)。但是由于CVS編碼存在一些問(wèn)題箱熬,大多數(shù)軟件開(kāi)發(fā)公司都使用SVN替代了CVS类垦。SVN是Subversion的簡(jiǎn)稱,是一個(gè)開(kāi)放源代碼的版本控制系統(tǒng)城须,相較于RCS蚤认、CVS,它采用了分支管理系統(tǒng)糕伐,它的設(shè)計(jì)目標(biāo)就是取代CVS砰琢。互聯(lián)網(wǎng)上很多版本控制服務(wù)已從CVS遷移到Subversion。說(shuō)得簡(jiǎn)單一點(diǎn)SVN就是用于多個(gè)人共同開(kāi)發(fā)同一個(gè)項(xiàng)目陪汽,共用資源的目的训唱。
而在分布式版本控制系統(tǒng)中,Git逐漸占據(jù)了上風(fēng)挚冤,目前况增,國(guó)外最大的社交編程及代碼托管網(wǎng)站Github,Bitbucket你辣,Gitlab巡通,國(guó)內(nèi)的碼云、Coding舍哄、華為軟件開(kāi)發(fā)云(DevCloud)中的配置管理等代碼托管平臺(tái)均支持Git宴凉。Git是一款免費(fèi)、開(kāi)源的分布式版本控制系統(tǒng)表悬,可以有效弥锄、高速的處理從很小到非常大的項(xiàng)目版本管理。Git是Linus Torvalds為了幫助管理Linux內(nèi)核開(kāi)發(fā)而開(kāi)發(fā)的一個(gè)開(kāi)放源碼的版本控制軟件蟆沫。Torvalds 開(kāi)始著手開(kāi)發(fā) Git 是為了作為一種過(guò)渡方案來(lái)替代 BitKeeper籽暇,后者之前一直是Linux內(nèi)核開(kāi)發(fā)人員在全球使用的主要源代碼工具。開(kāi)放源碼社區(qū)中的有些人覺(jué)得BitKeeper 的許可證并不適合開(kāi)放源碼社區(qū)的工作饭庞,因此Torvalds決定著手研究許可證更為靈活的版本控制系統(tǒng)戒悠。盡管最初Git的開(kāi)發(fā)是為了輔助Linux內(nèi)核開(kāi)發(fā)的過(guò)程,但是我們已經(jīng)發(fā)現(xiàn)在很多其他自由軟件項(xiàng)目中也使用了Git舟山。
而隨著擁有分布式版本控制系統(tǒng)優(yōu)勢(shì)的Git的快速發(fā)展绸狐,越來(lái)越多的開(kāi)發(fā)者準(zhǔn)備從集中式版本控制系統(tǒng)SVN遷移到Git上,這其中累盗,Git相對(duì)SVN表現(xiàn)出來(lái)的更有利于開(kāi)發(fā)者版本控制管理的特點(diǎn)自然是最重要的原因寒矿。
Git vs. SVN
因?yàn)閺膶儆诓煌募泻头植际侥J剑虼巳粽瑥墓ぷ髂J絹?lái)看符相,Git和SVN存在著比較明顯的不同,如下圖所示蠢琳。
集中式版本控制系統(tǒng)工作模型
分布式版本控制模型
從兩者的工作模式可以看到啊终,分布式相比于集中式的最大區(qū)別在于開(kāi)發(fā)者可以提交代碼到本地,每個(gè)開(kāi)發(fā)者通過(guò)克掳列搿(Git clone)孕索,在本地機(jī)器上拷貝一個(gè)完整的Git倉(cāng)庫(kù)。而SVN則必須將代碼提交到中心控制器躏碳。而由此產(chǎn)生的差異性搞旭,則決定了Git和SVN的各自的特性散怖。
安全性
首先在安全性方面,由于采用分布式系統(tǒng)肄渗,每個(gè)用戶就相當(dāng)于一個(gè)Git庫(kù)的備份镇眷,同時(shí),通過(guò)SHA1哈希保證數(shù)據(jù)的完整性翎嫡,防止惡意篡改欠动,因此,具有很高的安全性惑申。而SVN由于采用集中式具伍,因此,所有代碼版本庫(kù)均存儲(chǔ)在中央服務(wù)器中圈驼,因此人芽,存在很大的單點(diǎn)故障的風(fēng)險(xiǎn),同時(shí)绩脆,當(dāng)服務(wù)器端歷史數(shù)據(jù)被篡改時(shí)萤厅,客戶端難以發(fā)現(xiàn)。
分支功能
在分支功能方面靴迫,由于Git采用本質(zhì)上指向Commit對(duì)象的可變指針惕味,因此,便于查詢和追溯分支間的提交歷史玉锌,并能夠支持雙向合并名挥。而SVN分支不支持提交隔離,雖然一次提交可同時(shí)更改主線和分支的內(nèi)容主守,但無(wú)法查詢和追溯分支間的提交歷史躺同。
發(fā)布控制
在Git中,可以設(shè)置只有發(fā)布管理員才有權(quán)限推送的版本庫(kù)或者分支丸逸,用于穩(wěn)定發(fā)布版本的維護(hù),還可以設(shè)置只有項(xiàng)目經(jīng)理剃袍、模塊管理員才有權(quán)推送的版本庫(kù)或者分支黄刚,用于整合測(cè)試,因此民效,發(fā)布控制相當(dāng)靈活憔维,而SVN并沒(méi)有明確的發(fā)布控制配置,更多的還是依靠用戶自己的習(xí)慣畏邢。
開(kāi)發(fā)審核
在開(kāi)發(fā)審核方便业扒,Git支持團(tuán)隊(duì)成員自建分支和版本庫(kù)。通過(guò)合并請(qǐng)求或從成員個(gè)人版本庫(kù)舒萎、分支獲取提交程储,從提交說(shuō)明、代碼規(guī)范等方面對(duì)提交逐一審核。而SVN則不具備這些功能章鲤。
合并支持
Git基于DAG(有向非環(huán)圖)的設(shè)計(jì)比SVN的線性提交提供更好的合并追蹤摊灭,避免不必要的沖突,提高了工作效率败徊。而Git基于對(duì)內(nèi)容的追蹤而非對(duì)文件名追蹤帚呼,所以遇到一方或雙方對(duì)文件名更改時(shí),能夠很好進(jìn)行自動(dòng)合并或提供工具輔助合并皱蹦。而SVN遇到同樣問(wèn)題時(shí)會(huì)產(chǎn)生樹(shù)沖突煤杀,解決起來(lái)很麻煩。
因此沪哺,從以上的對(duì)比可以看出沈自,Git相對(duì)于SVN具有不少的優(yōu)勢(shì),因此凤粗,從SVN遷移到Git成為了眾多開(kāi)發(fā)者的選擇酥泛。
從SVN到Git
那么,從SVN到底如何切換到Git呢嫌拣?實(shí)際上柔袁,方法有很多種,也都并不是很復(fù)雜异逐,其中捶索,CSDN博主UrChen提供了一種切換的方法,只需要簡(jiǎn)單的幾步灰瞻,即可完成從SVN完美切換到Git腥例。
1.使用git svn clone 拷貝SVN倉(cāng)庫(kù)
cd ~/test_repo
git svn clone file:///home/*/Desktop/SVN/svn_repo/ -T trunk -b branches -t tags
2.新建一個(gè)Git的bare倉(cāng)庫(kù)
cd ..
mkdir test.git
cd test.git
git init --bare
3.將Git的默認(rèn)分支和SVN的默認(rèn)分支trunk對(duì)應(yīng)起來(lái)
git checkout trunk
4.將test_repo推送到test.git中
cd ~/test_repo
git remote add bare ~/test.git
git push bare
此時(shí)就完成了推送,可以刪除test_repo了
5.將Git repo中的trunk重命名為master
cd ~/test.git
git branch -m trunk master
6.將SVN repo中的tags移動(dòng)到git repo的相應(yīng)位置
使用git svn clone導(dǎo)出版本庫(kù)的時(shí)候會(huì)將svn中的tags保存成git中的tags/**酝润,而并不是默認(rèn)的tag燎竖,所以要進(jìn)行移動(dòng)。(注意:此腳本僅示例tag是單級(jí)目錄的情況要销,如果 tag 是包含目錄的兩級(jí)或者多級(jí)tag构回,請(qǐng)自行重新撰寫腳本)
cd ~/test.git
git for-each-ref --format=′%(refname)′ refs/heads/tags |
cut -d / -f 4 |
while read ref
do
git tag "$ref" "refs/heads/tags/$ref";
git branch -D "tags/$ref";
done
7.完成遷移,得到test.git
進(jìn)入工作文件夾疏咐,執(zhí)行
git clone ~/test.git
OK纤掸,大功告成,使用Git進(jìn)行版本管理吧浑塞。
除此之外借跪,還有幾個(gè)問(wèn)題需要說(shuō)明:
1、通過(guò)git-svn工具可以在SVN遷移到Git上酌壕,保留倉(cāng)庫(kù)歷史記錄掏愁。
2歇由、切換到Git后推薦策略建議采用長(zhǎng)期分支、特性分支托猩。
3印蓖、目前Git還沒(méi)法做到像SVN中對(duì)特定文件夾的細(xì)分權(quán)限控制,但可通過(guò)分倉(cāng)或建立多分支的方式引導(dǎo)用戶使用京腥。
4赦肃、切換到Git后遇到合并沖突時(shí),分兩種情況:
類型1:修改了同一個(gè)文件的同一行
解決方法:確認(rèn)正確的修改公浪,然后用命令行解決他宛,示例如下:
類型2:文件被重命名為不同的名字(樹(shù)沖突)
解決辦法:確認(rèn)哪個(gè)名字是正確的,刪除錯(cuò)誤的欠气,示例如下:
DevCloud與Git
前面已經(jīng)說(shuō)過(guò)厅各,華為軟件開(kāi)發(fā)云(DevCloud)中的配置管理服務(wù)全面支持Git,并對(duì)Git進(jìn)行了全面優(yōu)化预柒。而實(shí)際上队塘,這個(gè)配置管理服務(wù)就是面向軟件開(kāi)發(fā)者提供的基于Git的在線代碼托管服務(wù)。對(duì)于管理員和項(xiàng)目經(jīng)理宜鸯,它提供了倉(cāng)庫(kù)管理憔古、權(quán)限管理、成員管理淋袖、分支保護(hù)鸿市、安全管控及統(tǒng)計(jì)服務(wù),對(duì)于開(kāi)發(fā)者即碗,它則提供了代碼托管焰情、代碼倉(cāng)庫(kù)、在線客戶端等服務(wù)剥懒。配置管理服務(wù)的產(chǎn)品架構(gòu)圖内舟,如下圖所示:
DevCloud的配置管理服務(wù)對(duì)Git的優(yōu)化主要體現(xiàn)在以下幾點(diǎn):
1)支持跨地域協(xié)同開(kāi)發(fā)、本地離線操作初橘、代碼合入評(píng)審验游。
2)支持在線客戶端、代碼在線瀏覽壁却、修改、提交裸准、在線創(chuàng)建分支展东、比較分支、新建合并請(qǐng)求炒俱。
3)具有代碼加密傳輸盐肃、倉(cāng)庫(kù)權(quán)限管理爪膊、分支保護(hù)等多種安全措施。
4)提供了大量的倉(cāng)庫(kù)模板砸王、通用模板推盛,以方便開(kāi)發(fā)者提高創(chuàng)建效率。
5)提供基于代碼的統(tǒng)計(jì)分析谦铃、倉(cāng)庫(kù)提交信息統(tǒng)計(jì)耘成、貢獻(xiàn)者統(tǒng)計(jì)等相關(guān)統(tǒng)計(jì)數(shù)據(jù)。
總結(jié)
總之驹闰,從SVN切換到Git目前來(lái)看瘪菌,是利多弊少,也是一個(gè)趨勢(shì)嘹朗,建議有條件的開(kāi)發(fā)人員可以嘗試一下师妙,此外,DevCloud中的配置管理針對(duì)開(kāi)發(fā)人員使用Git做了大量的優(yōu)化工作屹培,感興趣的朋友也可以登錄http://t.cn/RF2flXS網(wǎng)站下載試用默穴,體驗(yàn)一把用優(yōu)化了的Git進(jìn)行版本控制的感受!