從SVN到Git最強(qiáng)指南

對(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)行版本控制的感受!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末褪秀,一起剝皮案震驚了整個(gè)濱河市蓄诽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溜歪,老刑警劉巖若专,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝴猪,居然都是意外死亡调衰,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門自阱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嚎莉,“玉大人,你說(shuō)我怎么就攤上這事沛豌∏髀幔” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵加派,是天一觀的道長(zhǎng)叫确。 經(jīng)常有香客問(wèn)我,道長(zhǎng)芍锦,這世上最難降的妖魔是什么竹勉? 我笑而不...
    開(kāi)封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮娄琉,結(jié)果婚禮上次乓,老公的妹妹穿的比我還像新娘吓歇。我一直安慰自己,他們只是感情好票腰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布城看。 她就那樣靜靜地躺著,像睡著了一般杏慰。 火紅的嫁衣襯著肌膚如雪测柠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天逃默,我揣著相機(jī)與錄音鹃愤,去河邊找鬼。 笑死完域,一個(gè)胖子當(dāng)著我的面吹牛软吐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吟税,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凹耙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了肠仪?” 一聲冷哼從身側(cè)響起肖抱,我...
    開(kāi)封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎异旧,沒(méi)想到半個(gè)月后意述,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吮蛹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年荤崇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潮针。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡术荤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出每篷,到底是詐尸還是另有隱情瓣戚,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布焦读,位于F島的核電站子库,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏矗晃。R本人自食惡果不足惜仑嗅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧无畔,春花似錦、人聲如沸吠冤。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拯辙。三九已至郭变,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涯保,已是汗流浹背诉濒。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留夕春,地道東北人未荒。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像及志,于是被迫代替她去往敵國(guó)和親片排。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 前言 Git使用教程 Git是什么 Git是一個(gè)開(kāi)源的分布式版本控制系統(tǒng)速侈,用于敏捷高效地處理任何或小或大的項(xiàng)目率寡。 ...
    90后的思維閱讀 899評(píng)論 0 0
  • Git教程 一、Git簡(jiǎn)介 1.1. Git的誕生1.2.集中式的vs分布式 二倚搬、安裝Git 三冶共、創(chuàng)建版本庫(kù) 四、...
    曹淵說(shuō)創(chuàng)業(yè)閱讀 940評(píng)論 0 2
  • git和svn是目前最常用的團(tuán)隊(duì)協(xié)作的版本控制系統(tǒng)命咐。 本人起初用過(guò)git,后來(lái)用過(guò)svn谐岁。算是兩個(gè)版本控制系統(tǒng)都用...
    江湖相望知冷暖閱讀 4,329評(píng)論 0 6
  • Git 是目前最流行的分布式版本控制系統(tǒng)之一醋奠。 版本控制指的是,記錄每次版本變更的內(nèi)容和時(shí)間等細(xì)節(jié)伊佃,保留各版本之間...
    神齊閱讀 1,409評(píng)論 0 7
  • 這一生窜司,因了上輩子的果;下輩子,會(huì)再循著今世的因航揉。循環(huán)往復(fù)塞祈,輪回不斷。這樣想帅涂,就通了议薪。沒(méi)有什么過(guò)不去的坎尤蛮,是非善惡...
    我以為我是一顆蘋果閱讀 273評(píng)論 0 1