我使用了十幾年的svn贱鄙,然而現(xiàn)在我轉(zhuǎn)投了git的懷抱~
關(guān)于svn和git的使用
我不會在這里講如何使用svn和git筛峭,因為網(wǎng)上已經(jīng)有大量的文章詳細(xì)講解如何使用它們喳篇。要注意的是svn和git有很多不同的軟件可以選擇迅矛。每種軟件的使用習(xí)慣都有點不同型宝。學(xué)習(xí)使用版本管理系統(tǒng)會有一些成本,但一旦你掌握了如何使用它們你會發(fā)現(xiàn)它對你的幫助很大捂襟。
SVN :windows系統(tǒng)推薦使用 TortoiseSVN 咬腕,蘋果系統(tǒng)推薦使用 Cornerstone
Git :windows系統(tǒng)推薦使用 TortoiseGit ,蘋果系統(tǒng)推薦使用 Tower
下面就說說為何我從svn遷移到git
誠然svn是一個很不錯的系統(tǒng)葬荷。我有無數(shù)個項目使用它郎汪。包括之前工作的公司和現(xiàn)在我自己的團(tuán)隊。但是git有很多優(yōu)秀的地方填補了svn功能空缺也解決了很多svn使用上的問題闯狱。
當(dāng)沒有網(wǎng)絡(luò)的時候
有很多次我外出的時候需要修改一些代碼,而且有時候咖啡廳的wifi并不好或者所處的地方根本沒有網(wǎng)絡(luò)抛计。這個時候我會像沒有版本管理系統(tǒng)一樣把準(zhǔn)備要修改的文件復(fù)制一份出來保存然后再開始工作哄孤。這個就是svn最大的問題,如果你斷網(wǎng)了吹截,你就不能使用版本管理系統(tǒng)了瘦陈。
這是由于svn的版本庫存只有一個而且存放在服務(wù)器上。而git的版本庫概念和svn很不一樣波俄。你可以理解為在服務(wù)器上依然有一個集中了所有東西的版本庫晨逝。同時,在你的電腦和其他使用這個項目的成員的電腦里都有一個獨立的版本庫懦铺。這樣的好處就是即使沒有網(wǎng)絡(luò)我也可以放心的在本地修改文件捉貌,可以使用版本管理帶來的各種好處。當(dāng)我需要把修改內(nèi)容上傳到服務(wù)器的時候我只需要把本地的版本庫同步到服務(wù)器的版本庫上。
當(dāng)你需要修改一個項目但又不想影響現(xiàn)在項目的內(nèi)容
在版本控制系統(tǒng)里面你需要通過分支來實現(xiàn)趁窃。然而svn的分支很坑爹牧挣。它會在你原有的工程里復(fù)制你需要分支的文件夾然后改名。對你沒看錯醒陆。你的工程突然就多了一個文件夾瀑构,而且當(dāng)你分支很多的時候各種文件夾就到處飛了。在git里面分支是基于整個工程的刨摩。它不會新建新的文件夾來存儲分支的內(nèi)容而是使用類似快照的方式寺晌。
例如你項目有文件夾 a ,在svn里面創(chuàng)建分支后你的項目是這樣的:a a1 a2 a3 a4 a5澡刹。不管你分支里面是否有修改內(nèi)容呻征,即使什么修改都沒有,每創(chuàng)建一個分支都會復(fù)制一份文件夾像屋。在git里面創(chuàng)建分支之后你的項目是這樣的 a 怕犁。對,還是你原來的文件夾己莺。當(dāng)你切換分支之后a會變成a1奏甫。在git里面不用擔(dān)心在一個分支里面修改會影響其他的分支,它們是獨立的凌受。
如果上傳了錯的內(nèi)容
在svn里面如果你上傳了錯的內(nèi)容阵子,或者你后悔某次提交的內(nèi)容。不好意思胜蛉,你只能再提交一次新的內(nèi)容上去挠进。svn會記錄每一次修改而且是不可逆的。而且因為svn只有一個在服務(wù)器上的公共版本庫誊册,所以如果多人協(xié)作開發(fā)一個項目领突,這個問題會是很大的麻煩。如果有人剛好上傳了有問題的內(nèi)容而其他成員又剛好更新了一次案怯。這個時候有問題的內(nèi)容就會擴(kuò)散到其他人手中君旦。如果負(fù)責(zé)人修改時間長,所有人都需要回滾到上一個版本再開發(fā)嘲碱,不過通常這樣會帶來更多的版本沖突問題金砍。或者有人使用上一個版本的內(nèi)容重新提交了一個版本讓大家更新麦锯。這種方法大家會很開心恕稠。但修改問題的負(fù)責(zé)人會遇到版本沖突問題。如果負(fù)責(zé)人修改時間短扶欣,那么大家可能停下來喝杯咖啡等他修改好上傳大家再下載一遍鹅巍。
在git里面每個人的電腦里都會有一個獨立的版本庫千扶。我是指每個人的電腦里的每個項目都有一個本地的獨立版本庫。一般你需要先把修改提交到本地的版本庫確認(rèn)無誤之后再同步到服務(wù)器昆著。如果你發(fā)現(xiàn)某次提交有問題县貌,你可以在本地庫里刪除這次修改。在你最終上傳服務(wù)器之前你的修改不會影響其他人凑懂。
發(fā)現(xiàn)關(guān)注的點么煤痕?git可以讓你使用版本管理的特性而無需擔(dān)心影響其他人的工作。
關(guān)于多項目管理
一般情況下一個團(tuán)隊會有一個svn庫接谨。在這個庫里面使用文件夾區(qū)分項目摆碉。文件夾的管理方式每間公司都不一樣。svn的管理員會給每個成員對應(yīng)每個目錄分配權(quán)限脓豪。也就是誰可以訪問什么目錄不能訪問什么目錄巷帝。如果svn穩(wěn)定的話這樣有個好處,就是所有的項目都在一個地方管理扫夜。為何我說穩(wěn)定問題呢楞泼?svn的服務(wù)端是很穩(wěn)定的至少我用svn這十幾年沒有遇到過一次問題。但svn的客戶端總有各種各樣的原因?qū)е履愕墓ぷ髂夸洷罎⒌趔源场H绻闵暇W(wǎng)找相關(guān)的內(nèi)容你會發(fā)現(xiàn)很多關(guān)于svn工作目錄無法被svn識別堕阔,或者工作目錄無法更新和提交等問題。解決方法可以很直接颗味,直接刪除原有的工作目錄重新checkout一次服務(wù)器上的內(nèi)容就行了超陆。如果你剛好遇到本地修改了東西沒有提交,你就需要把你修改過的文件先保存出來浦马。重點來了时呀,如果你修改的東西很多脐区,這個時候沒有svn提示你哪些文件被修改了区岗。你要把這些文件找出來會是一件很痛苦的事情。我就遇到過很多次這樣問題呕屎。
為何不能每一個項目一個svn版本庫磺陡?因為那樣的話你需要管理員為每個庫重新配置你們的用戶名密碼以及權(quán)限瞧预。當(dāng)然了你其實也可以不checkout整個svn。你可以把svn里面項目的目錄一個個獨立的checkout下來仅政。
如果你使用github或者gitlab這種管理系統(tǒng)。每個項目在服務(wù)器上都會是一個獨立的版本庫盆驹。
關(guān)于版本庫遷移
如果你使用svn圆丹,當(dāng)你需要切換當(dāng)前電腦里面的項目到另一個服務(wù)器上。你需要先把原有的項目導(dǎo)出一份不帶svn信息的版本躯喇。然后把項目放到新服務(wù)器checkout的工作目錄里上傳辫封。這個時候你會發(fā)現(xiàn)項目雖然遷移到了新的服務(wù)器硝枉。但所有之前到版本信息都丟失了。新的服務(wù)器會認(rèn)為你是一個新添加的工程倦微,沒有歷史記錄妻味。
如果你使用git。你只需要在原有的項目里添加一個新的遠(yuǎn)端服務(wù)器然后提交上去欣福。是的你沒看錯责球,git支持多個遠(yuǎn)端服務(wù)器。經(jīng)常一種用法是你checkout了a服務(wù)器上的項目然后把它傳到自己的b服務(wù)器拓劝。你自己新的修改假設(shè)都傳到b服務(wù)器雏逾。a服務(wù)器上的項目可能會時不時更新。你可以從a上更新新的內(nèi)容郑临。然后把合并的修改再傳回b栖博。當(dāng)然如果有需要并且你有a服務(wù)器的上傳權(quán)限,你可以把內(nèi)容傳到a服務(wù)器上厢洞。
可以看到git處理多個遠(yuǎn)端版本庫的方式很自由而且很優(yōu)雅仇让。重點是,你所有的版本修改記錄都好好的呆在那躺翻。