SVN
SVN是Subversion的簡稱谭网,是一個開放源代碼的版本控制系統(tǒng),支持大多數(shù)常見的操作系統(tǒng)赃春。作為一個開源的版本控制系統(tǒng),Subversion管理著隨時間改變的數(shù)據(jù)。這些數(shù)據(jù)放置在一個中央資料檔案庫(repository)中聘鳞。這個檔案庫很像一個普通的文件服務(wù)器,不過它會記住每一次文件的變動要拂。這樣你就可以把檔案恢復(fù)到舊的版本,或是瀏覽文件的變動歷史。Subversion是一個通用的系統(tǒng),可用來管理任何類型的文件,其中包括了程序源碼脱惰。
集中式代碼管理的核心是服務(wù)器,所有開發(fā)者在開始新一天的工作之前必須從服務(wù)器獲取代碼采盒,然后開發(fā),最后解決沖突磅氨,提交。所有的版本信息都放在服務(wù)器上烦租。如果脫離了服務(wù)器,開發(fā)者基本上可以說是無法工作的挫以。下面舉例說明:
工作流程:
- 從服務(wù)器下載項(xiàng)目組最新代碼。
- 進(jìn)入自己的分支掐松,進(jìn)行工作粪小,每隔一個小時向服務(wù)器自己的分支提交一次代碼(很多人都有這個習(xí)慣。因?yàn)橛袝r候自己對代碼改來改去探膊,最后又想還原到前一個小時的版本,或者看看前一個小時自己修改了哪些代碼突想,就需要這樣做了)。
- 下班時間快到了袭灯,把自己的分支合并到服務(wù)器主分支上,一天的工作完成稽荧,并反映給服務(wù)器工腋。
GIT(分布式版本控制系統(tǒng))
Git是一款免費(fèi)、開源的分布式版本控制系統(tǒng)擅腰,用于敏捷高效地處理任何或小或大的項(xiàng)目
Git是一個開源的分布式版本控制系統(tǒng),用以有效趁冈、高速的處理從很小到非常大的項(xiàng)目版本管理拜马。Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個開放源碼的版本控制軟件俩莽。
分布式相比于集中式的最大區(qū)別在于開發(fā)者可以提交到本地,每個開發(fā)者通過克掳绯(git clone)蹋肮,在本地機(jī)器上拷貝一個完整的Git倉庫.
Git的功能特性:
從一般開發(fā)者的角度來看,git有以下功能:
- 從服務(wù)器上克隆完整的Git倉庫(包括代碼和版本信息)到單機(jī)上括尸。
- 在自己的機(jī)器上根據(jù)不同的開發(fā)目的,創(chuàng)建分支濒翻,修改代碼。
- 在單機(jī)上自己創(chuàng)建的分支上提交代碼淌喻。
- 在單機(jī)上合并分支。
- 把服務(wù)器上最新版的代碼fetch下來裸删,然后跟自己的主分支合并阵赠。
- 生成補(bǔ)丁(patch)清蚀,把補(bǔ)丁發(fā)送給主開發(fā)者。
- 看主開發(fā)者的反饋枷邪,如果主開發(fā)者發(fā)現(xiàn)兩個一般開發(fā)者之間有沖突(他們之間可以合作解決的沖突),就會要求他們先解決沖突践惑,然后再由其中一個人提交。如果主開發(fā)者可以自己解決尔觉,或者沒有沖突脸候,就通過。
- 一般開發(fā)者之間解決沖突的方法运沦,開發(fā)者之間可以使用pull 命令解決沖突,解決完沖突之后再向主開發(fā)者提交補(bǔ)丁携添。
從主開發(fā)者的角度(假設(shè)主開發(fā)者不用開發(fā)代碼)看,git有以下功能:
- 查看郵件或者通過其它方式查看一般開發(fā)者的提交狀態(tài)羞秤。
- 打上補(bǔ)丁,解決沖突(可以自己解決瘾蛋,也可以要求開發(fā)者之間解決以后再重新提交矫限,如果是開源項(xiàng)目,還要決定哪些補(bǔ)丁有用叼风,哪些不用)。
- 向公共服務(wù)器提交結(jié)果无宿,然后通知所有開發(fā)人員。
區(qū)別
-
SVN屬于集中化的版本控制系統(tǒng)蹂午,有個不太精確的比喻:SVN = 版本控制+ 備份服務(wù)器
SVN使用起來有點(diǎn)像是檔案倉庫的感覺,支持并行讀寫文件画侣,支持代碼的版本化管理堡妒,功能包括取出、導(dǎo)入皮迟、更新、分支伏尼、改名、還原燥透、合并等沙咏。Git是一個分布式版本控制系統(tǒng)肢藐,操作命令包括:clone,pull吆豹,push,branch ,merge ,push,rebase理盆,Git擅長的是程序代碼的版本化管理。
GIT跟SVN一樣有自己的集中式版本庫或服務(wù)器猿规。但,GIT更傾向于被使用于分布式模式姨俩,也就是每個開發(fā)人員從中心版本庫/服務(wù)器上chect out代碼后會在自己的機(jī)器上克隆一個自己的版本庫《嘉保可以這樣說,如果你被困在一個不能連接網(wǎng)絡(luò)的地方時陨晶,就像在飛機(jī)上帝璧,地下室,電梯里等的烁,你仍然能夠提交文件,查看歷史版本記錄渴庆,創(chuàng)建項(xiàng)目分支,等刃滓。對一些人來說,這好像沒多大用處咧虎,但當(dāng)你突然遇到?jīng)]有網(wǎng)絡(luò)的環(huán)境時计呈,這個將解決你的大麻煩征唬。
GIT把內(nèi)容按元數(shù)據(jù)方式存儲茁彭,而SVN是按文件
所有的資源控制系統(tǒng)都是把文件的元信息隱藏在一個類似.svn,.cvs等的文件夾里。如果你把.git目錄的體積大小跟.svn比較尉间,你會發(fā)現(xiàn)它們差距很大击罪。因?yàn)?.git目錄是處于你的機(jī)器上的一個克隆版的版本庫,它擁有中心版本庫上所有的東西媳禁,例如標(biāo)簽,分支竣稽,版本記錄等。分支在SVN中一點(diǎn)不特別娃弓,就是版本庫中的另外的一個目錄。如果你想知道是否合并了一個分支台丛,你需要手工運(yùn)行像這樣的命令svn propget svn:mergeinfo,來確認(rèn)代碼是否被合并挽霉。然而变汪,處理GIT的分支卻是相當(dāng)?shù)暮唵魏陀腥ぁD憧梢詮耐粋€工作目錄下快速的在幾個分支間切換裙盾。你很容易發(fā)現(xiàn)未被合并的分支,你能簡單而快捷的合并這些文件番官。
GIT沒有一個全局的版本號,而SVN有
目前為止這是跟SVN相比GIT缺少的最大的一個特征假褪。你也知道,SVN的版本號實(shí)際是任何一個相應(yīng)時間的源代碼快照生音。我認(rèn)為它是從CVS進(jìn)化到SVN的最大的一個突破。因?yàn)镚IT和SVN從概念上就不同缀遍,我不知道GIT里是什么特征與之對應(yīng)。如果你有任何的線索域醇,請在評論里奉獻(xiàn)出來與大家共享。GIT的內(nèi)容完整性要優(yōu)于SVN:
GIT的內(nèi)容存儲使用的是SHA-1哈希算法譬挚。這能確保代碼內(nèi)容的完整性,確保在遇到磁盤故障和網(wǎng)絡(luò)問題時降低對版本庫的破壞减宣。
優(yōu)缺點(diǎn)
SVN 的優(yōu)缺點(diǎn)
SVN對中文支持好,操作簡單贼邓,使用沒有難度,美工人員塑径,產(chǎn)品人員填具,測試人員,實(shí)施人員都可輕松上手灌旧。使用界面統(tǒng)一,功能完善枢泰,操作方便。
Git的優(yōu)缺點(diǎn)
對程序源代碼進(jìn)行差異化的版本管理窿克,代碼庫占極少的空間。易于代碼的分支化管理年叮。不支持中文,圖形界面支持差只损,使用難度大。不易推廣跃惫。
適用范圍:
適用對象不同。Git適用于參與開源項(xiàng)目的開發(fā)者蛉顽。他們由于水平高,更在乎的是效率而不是易用性携冤。SVN則不同闲勺,它適合普通的公司開發(fā)團(tuán)隊(duì)。使用起來更加容易霉翔。
使用的場合不同苞笨。Git適用于通過Internet,有多個開發(fā)角色的單個項(xiàng)目開發(fā)瀑凝,SVN適合企業(yè)內(nèi)部由項(xiàng)目經(jīng)理統(tǒng)一協(xié)調(diào)的多個并行項(xiàng)目的開發(fā)。
權(quán)限管理策略不同粤咪。Git沒有嚴(yán)格的權(quán)限管理控制,只要有帳號寥枝,就可以導(dǎo)出、導(dǎo)入代碼某筐,甚至執(zhí)行回退操作。SVN則有嚴(yán)格的權(quán)限管理南誊,可以按組蜜托、按個人進(jìn)行針對某個子目錄的權(quán)限控制。區(qū)分讀橄务、寫權(quán)限。更嚴(yán)格的蜂挪,不支持回退操作迫肖。保證代碼永遠(yuǎn)可以追蹤攒驰。
分支(branch)的使用范圍不一樣。Git中隅津,你只能針對整個倉庫作branch,而且一旦刪除,便無法恢復(fù)伦仍。而SVN中,branch可以針對任何子目錄充蓝,它本質(zhì)上是一個拷貝操作喉磁。所以,可以建立非常多协怒、層次性的branch,并且,在不需要時將其刪除孕暇,而以后需要時只要checkout老的SVN版本就可以了。
基于第三點(diǎn)隧哮,Git適用于單純的軟件項(xiàng)目,典型的就是一些開源項(xiàng)目沮翔,比如Linux內(nèi)核、busybox等鉴竭。相反岸浑,SVN擅長多項(xiàng)目管理。比如矢洲,你可以在一個SVN倉庫中存放一個手機(jī)項(xiàng)目的bsp/設(shè)計文檔/文件系統(tǒng)/應(yīng)用程序/自動化編譯腳本,或者在一個SVN中存放5款手機(jī)項(xiàng)目的文件系統(tǒng)。git中必須建立n(項(xiàng)目數(shù))*m(組件數(shù))個倉庫袁滥。SVN中只需要最多n或者m個就可以了灾螃。
Git使用128位ID作為版本號,而且checkout時要注明是哪個branch,而SVN使用一個遞增的序列號作為全局唯一的版本號腰鬼,更加簡明易懂。雖然可以使用gittag來建立一些文字化的別名熄赡,但是畢竟那只是針對特殊版本。
可跟蹤性炊豪,git的典型開發(fā)過程為:建立分支,進(jìn)行開發(fā)词渤,提交到本地master,刪除分支掖肋。這樣做的后果是以前的修改細(xì)節(jié)會丟失赏参。而在SVN下做同樣的事情,不會丟失任何細(xì)節(jié)把篓。這里是一個有趣的鏈接腰涧,表明了git下典型的工作方式:(以master為核心,不斷創(chuàng)建新branch,刪除舊branch):
局部更新窖铡,局部還原。SVN由于是在每個文件夾建立一個.svn文件夾來實(shí)現(xiàn)管理费彼,所以可以很簡單實(shí)現(xiàn)局部更新或者還原。假如你只希望更新某些部分箍铲,則svn可以很好實(shí)現(xiàn)。同時代碼寫錯了关划,同時可以很好實(shí)現(xiàn)局部還原,當(dāng)然git也可以通過歷史版本還原贮折,但是無法簡單地實(shí)現(xiàn)局部還原。
SVN屬于集中化的版本控制系統(tǒng)
這種做法帶來了許多好處调榄,特別是相較于老式的本地VCS來說。現(xiàn)在臼疫,每個人都可以一定程度上看到項(xiàng)目中的其他人正在做些什么扣孟。而管理員也可以輕松掌控每個開發(fā)者的權(quán)限。
事分兩面凤价,有好有壞。這么做最顯而易見的缺點(diǎn)是中央服務(wù)器的單點(diǎn)故障利诺。若是宕機(jī)一小時,那么在這一小時內(nèi)慢逾,誰都無法提交更新、還原口注、對比等,也就無法協(xié)同工作寝志。如果中央服務(wù)器的磁盤發(fā)生故障策添,并且沒做過備份或者備份得不夠及時的話,還會有丟失數(shù)據(jù)的風(fēng)險唯竹。最壞的情況是徹底丟失整個項(xiàng)目的所有歷史更改記錄,被客戶端提取出來的某些快照數(shù)據(jù)除外摩窃,但這樣的話依然是個問題芬骄,你不能保證所有的數(shù)據(jù)都已經(jīng)有人提取出來鹦聪。
Subversion原理上只關(guān)心文件內(nèi)容的具體差異。每次記錄有哪些文件作了更新泽本,以及都更新了哪些行的什么內(nèi)容。
Subversion的特點(diǎn)概括起來主要由以下幾條:
- 每個版本庫有唯一的URL(官方地址)蒲牧,每個用戶都從這個地址獲取代碼和數(shù)據(jù);
- 獲取代碼的更新冰抢,也只能連接到這個唯一的版本庫艘狭,同步以取得最新數(shù)據(jù);
- 提交必須有網(wǎng)絡(luò)連接(非本地版本庫)巢音;
- 提交需要授權(quán),如果沒有寫權(quán)限官撼,提交會失敗掠哥;
- 提交并非每次都能夠成功。如果有其他人先于你提交龙致,會提示“改動基于過時的版本,先更新再提交”… 諸如此類;
- 沖突解決是一個提交速度的競賽:手快者屈梁,先提交,平安無事在讶;手慢者,后提交革答,可能遇到麻煩的沖突解決战坤。
Git屬于分布式的版本控制系統(tǒng)
自2005年誕生于以來残拐,Git日臻成熟完善途茫,在高度易用的同時囊卜,仍然保留著初期設(shè)定的目標(biāo)。它的速度飛快栅组,極其適合管理大項(xiàng)目,它還有著令人難以置信的非線性分支管理系統(tǒng)玉掸,可以應(yīng)付各種復(fù)雜的項(xiàng)目開發(fā)需求醒叁。
與SVN不同,Git記錄版本歷史只關(guān)心文件數(shù)據(jù)的整體是否發(fā)生變化辐益。Git并不保存文件內(nèi)容前后變化的差異數(shù)據(jù)。實(shí)際上智政,Git更像是把變化的文件作快照后,記錄在一個微型的文件系統(tǒng)中续捂。每次提交更新時,它會縱覽一遍所有文件的指紋信息并對文件作一快照劫拗,然后保存一個指向這次快照的索引。為提高性能页慷,若文件沒有變化胁附,Git不會再次保存,而只對上次保存的快照作一連接控妻。