SVN和Git 介紹,區別,優缺點以及適用範圍

SVN是Subversion的簡稱,是一個開放源代碼的版本控制系統,支持大多數常見的操做系統。做爲一個開源的版本控制系統,Subversion管理着隨時間改變的數據。這些數據放置在一箇中央資料檔案庫(repository)中。這個檔案庫很像一個普通的文件服務器,不過它會記住每一次文件的變更。這樣你就能夠把檔案恢復到舊的版本,或是瀏覽文件的變更歷史。Subversion是一個通用的系統,可用來管理任何類型的文件,其中包括了程序源碼。git

 

工做流程github

集中式管理的工做流程以下圖:算法

集中式代碼管理的核心是服務器,全部開發者在開始新一天的工做以前必須從服務器獲取代碼,而後開發,最後解決衝突,提交。全部的版本信息都放在服務器上。若是脫離了服務器,開發者基本上能夠說是沒法工做的。下面舉例說明:服務器

開始新一天的工做:網絡

一、從服務器下載項目組最新代碼。分佈式

二、進入本身的分支,進行工做,每隔一個小時向服務器本身的分支提交一次代碼(不少人都有這個習慣。由於有時候本身對代碼改來改去,最後又想還原到前一個小時的版本,或者看看前一個小時本身修改了哪些代碼,就須要這樣作了)。svn

三、下班時間快到了,把本身的分支合併到服務器主分支上,一天的工做完成,並反映給服務器。性能

GIT(分佈式版本控制系統)測試

Git是一款免費、開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目fetch

Git是一個開源的分佈式版本控制系統,用以有效、高速的處理從很小到很是大的項目版本管理。Git 是 Linus Torvalds 爲了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。

分佈式相比於集中式的最大區別在於開發者能夠提交到本地,每一個開發者經過克隆(git clone),在本地機器上拷貝一個完整的Git倉庫.

 

工做流程

下圖是經典的git開發過程。

Git的功能特性:

從通常開發者的角度來看,git有如下功能:

一、從服務器上克隆完整的Git倉庫(包括代碼和版本信息)到單機上。

二、在本身的機器上根據不一樣的開發目的,建立分支,修改代碼。

三、在單機上本身建立的分支上提交代碼。

四、在單機上合併分支。

五、把服務器上最新版的代碼fetch下來,而後跟本身的主分支合併。

六、生成補丁(patch),把補丁發送給主開發者。

七、看主開發者的反饋,若是主開發者發現兩個通常開發者之間有衝突(他們之間能夠合做解決的衝突),就會要求他們先解決衝突,而後再由其中一我的提交。若是主開發者能夠本身解決,或者沒有衝突,就經過。

八、通常開發者之間解決衝突的方法,開發者之間可使用pull 命令解決衝突,解決完衝突以後再向主開發者提交補丁。

 

從主開發者的角度(假設主開發者不用開發代碼)看,git有如下功能:

一、查看郵件或者經過其它方式查看通常開發者的提交狀態。

二、打上補丁,解決衝突(能夠本身解決,也能夠要求開發者之間解決之後再從新提交,若是是開源項目,還要決定哪些補丁有用,哪些不用)。

三、向公共服務器提交結果,而後通知全部開發人員。 

 

區別

1.SVN屬於集中化的版本控制系統,有個不太精確的比喻:SVN = 版本控制+ 備份服務器

   SVN使用起來有點像是檔案倉庫的感受,支持並行讀寫文件,支持代碼的版本化管理,功能包括取出、導入、更新、分支、更名、還原、合併等。

 

  Git是一個分佈式版本控制系統,操做命令包括:clone,pull,push,branch ,merge ,push,rebase,Git擅長的是程序代碼的版本化管理。

 

2.GIT跟SVN同樣有本身的集中式版本庫或服務器。但,GIT更傾向於被使用於分佈式模式,也就是每一個開發人員從中心版本庫/服務器上chect out代碼後會在本身的機器上克隆一個本身的版本庫。能夠這樣說,若是你被困在一個不能鏈接網絡的地方時,就像在飛機上,地下室,電梯裏等,你仍然可以提交文件,查看歷史版本記錄,建立項目分支,等。對一些人來講,這好像沒多大用處,但當你忽然遇到沒有網絡的環境時,這個將解決你的大麻煩。

 

3.GIT把內容按元數據方式存儲,而SVN是按文件

全部的資源控制系統都是把文件的元信息隱藏在一個相似.svn,.cvs等的文件夾裏。若是你把.git目錄的體積大小跟.svn比較,你會發現它們差距很大。由於,.git目錄是處於你的機器上的一個克隆版的版本庫,它擁有中心版本庫上全部的東西,例如標籤,分支,版本記錄等。

 

4.分支在SVN中一點不特別,就是版本庫中的另外的一個目錄。若是你想知道是否合併了一個分支,你須要手工運行像這樣的命令svn propget svn:mergeinfo,來確認代碼是否被合併。然而,處理GIT的分支倒是至關的簡單和有趣。你能夠從同一個工做目錄下快速的在幾個分支間切換。你很容易發現未被合併的分支,你能簡單而快捷的合併這些文件。

 

5.GIT沒有一個全局的版本號,而SVN有

目前爲止這是跟SVN相比GIT缺乏的最大的一個特徵。你也知道,SVN的版本號實際是任何一個相應時間的源代碼快照。我認爲它是從CVS進化到SVN的最大的一個突破。由於GIT和SVN從概念上就不一樣,我不知道GIT裏是什麼特徵與之對應。若是你有任何的線索,請在評論裏奉獻出來與你們共享。

 

6.GIT的內容完整性要優於SVN:

GIT的內容存儲使用的是SHA-1哈希算法。這能確保代碼內容的完整性,確保在遇到磁盤故障和網絡問題時下降對版本庫的破壞。 

 

優缺點

SVN 的優缺點

      SVN對中文支持好,操做簡單,使用沒有難度,美工人員,產品人員,測試人員,實施人員均可輕鬆上手。使用界面統一,功能完善,操做方便。

 

Git的優缺點

      對程序源代碼進行差別化的版本管理,代碼庫佔極少的空間。易於代碼的分支化管理。不支持中文,圖形界面支持差,使用難度大。不易推廣。

 

適用範圍

1)適用對象不一樣。Git適用於參與開源項目的開發者。他們因爲水平高,更在意的是效率而不是易用性。SVN則不一樣,它適合普通的公司開發團隊。使用起來更加容易。

 

2)使用的場合不一樣。Git適用於經過Internet,有多個開發角色的單個項目開發,SVN適合企業內部由項目經理統一協調的多個並行項目的開發。

 

3)權限管理策略不一樣。Git沒有嚴格的權限管理控制,只要有賬號,就能夠導出、導入代碼,甚至執行回退操做。SVN則有嚴格的權限管理,能夠按組、按我的進行鍼對某個子目錄的權限控制。區分讀、寫權限。更嚴格的,不支持回退操做。保證代碼永遠能夠追蹤。

 

4)分支(branch)的使用範圍不同。Git中,你只能針對整個倉庫做branch,並且一旦刪除,便沒法恢復。而SVN中,branch能夠針對任何子目錄,它本質上是一個拷貝操做。因此,能夠創建很是多、層次性的branch,而且,在不須要時將其刪除,而之後須要時只要checkout老的SVN版本就能夠了。

 

5)基於第三點,Git適用於單純的軟件項目,典型的就是一些開源項目,好比Linux內核、busybox等。相反,SVN擅長多項目管理。好比,你能夠在一個SVN倉庫中存放一個手機項目的bsp/設計文檔/文件系統/應用程序/自動化編譯腳本,或者在一個SVN中存放5款手機項目的文件系統。git中必須創建n(項目數)*m(組件數)個倉庫。SVN中只須要最多n或者m個就能夠了。

 

6)Git使用128位ID做爲版本號,並且checkout時要註明是哪一個branch,而SVN使用一個遞增的序列號做爲全局惟一的版本號,更加簡明易懂。雖然可使用gittag來創建一些文字化的別名,可是畢竟那只是針對特殊版本。

 

7)可跟蹤性,git的典型開發過程爲:創建分支,進行開發,提交到本地master,刪除分支。這樣作的後果是之前的修改細節會丟失。而在SVN下作一樣的事情,不會丟失任何細節。這裏是一個有趣的連接,代表了git下典型的工做方式:(以master爲核心,不斷建立新branch,刪除舊branch):

 

8)局部更新,局部還原。SVN因爲是在每一個文件夾創建一個.svn文件夾來實現管理,因此能夠很簡單實現局部更新或者還原。假如你只但願更新某些部分,則svn能夠很好實現。同時代碼寫錯了,同時能夠很好實現局部還原,固然git也能夠經過歷史版本還原,可是沒法簡單地實現局部還原。

 

SVN屬於集中化的版本控制系統

     這種作法帶來了許多好處,特別是相較於老式的本地VCS來講。如今,每一個人均可以必定程度上看到項目中的其餘人正在作些什麼。而管理員也能夠輕鬆掌控每一個開發者的權限。
事分兩面,有好有壞。這麼作最顯而易見的缺點是中央服務器的單點故障。如果宕機一小時,那麼在這一小時內,誰都沒法提交更新、還原、對比等,也就沒法協同工做。若是中央服務器的磁盤發生故障,而且沒作過備份或者備份得不夠及時的話,還會有丟失數據的風險。最壞的狀況是完全丟失整個項目的全部歷史更改記錄,被客戶端提取出來的某些快照數據除外,但這樣的話依然是個問題,你不能保證全部的數據都已經有人提取出來。
Subversion原理上只關心文件內容的具體差別。每次記錄有哪些文件做了更新,以及都更新了哪些行的什麼內容。

Subversion的特色歸納起來主要由如下幾條:

1.每一個版本庫有惟一的URL(官方地址),每一個用戶都從這個地址獲取代碼和數據;

2.獲取代碼的更新,也只能鏈接到這個惟一的版本庫,同步以取得最新數據;

3.提交必須有網絡鏈接(非本地版本庫);

4.提交須要受權,若是沒有寫權限,提交會失敗;

5.提交併不是每次都可以成功。若是有其餘人先於你提交,會提示「改動基於過期的版本,先更新再提交」… 諸如此類;

6衝突解決是一個提交速度的競賽:手快者,先提交,平安無事;手慢者,後提交,可能遇到麻煩的衝突解決。

 

Git屬於分佈式的版本控制系統 

    自2005年誕生於以來,Git日臻成熟完善,在高度易用的同時,仍然保留着初期設定的目標。它的速度飛快,極其適合管理大項目,它還有着使人難以置信的非線性分支管理系統,能夠應付各類複雜的項目開發需求。
與SVN不一樣,Git記錄版本歷史只關心文件數據的總體是否發生變化。Git並不保存文件內容先後變化的差別數據。實際上,Git更像是把變化的文件做快照後,記錄在一個微型的文件系統中。每次提交更新時,它會縱覽一遍全部文件的指紋信息並對文件做一快照,而後保存一個指向此次快照的索引。爲提升性能,若文件沒有變化,Git不會再次保存,而只對上次保存的快照做一鏈接。

簡略的說,Git具備如下特色:

1.Git中每一個克隆(clone)的版本庫都是平等的。你能夠從任何一個版本庫的克隆來建立屬於你本身的版本庫,同時你的版本庫也能夠做爲源提供給他人,只要你願意。

2.Git的每一次提取操做,實際上都是一次對代碼倉庫的完整備份。提交徹底在本地完成,無須別人給你受權,你的版本庫你做主,而且提交老是會成功。

3.甚至基於舊版本的改動也能夠成功提交,提交會基於舊的版本建立一個新的分支。

4.Git的提交不會被打斷,直到你的工做徹底滿意了,PUSH給他人或者他人PULL你的版本庫,合併會發生在PULL和PUSH過程當中,不能自動解決的衝突會提示您手工完成。

5.衝突解決再也不像是SVN同樣的提交競賽,而是在須要的時候才進行合併和衝突解決。

 總之,公司的開發團隊在進行的項目開發管理時,svn是更好的選擇,團隊成員共同維護公司的中心版本。

如果開源項目,則git更加適合,每一個人均可以維護本身專屬的版本,同時有github開源社區支持。

轉載:https://mp.weixin.qq.com/s/dR4a_kUXmsa5_wvFLAGAtw

相關文章
相關標籤/搜索