首頁  >  文章  >  開發工具  >  GIT 和 SVN 區別詳解

GIT 和 SVN 區別詳解

Guanhui
Guanhui轉載
2020-07-18 17:44:175042瀏覽

GIT 和 SVN 區別詳解

GIT不只是個版本控制系統,它也是內容管理系統(CMS),工作管理系統等。如果你是一個具有使用SVN背景的人,你需要做一定的思想轉換,來適應GIT提供的一些概念和特徵。所以,這篇文章的主要目的就是透過介紹GIT能做什麼、它和SVN在深層次上究竟有什麼不同來幫助你認識它。

一. GIT是分散式的,SVN不是:

這是GIT和其它非分散式的版本控制系統,例如SVN,CVS等,最核心的區別。如果你能理解這個概念,那麼你就已經上手一半了。需要做一點聲明,GIT並不是目前第一個或唯一的分散式版本控制系統。還有一些系統,例如Bitkeeper, Mercurial等,也是運行在分散式模式上的。但GIT在這方面做的更好,而且有更多強大的功能特徵。

GIT跟SVN一樣有自己的集中式版本庫或伺服器。但,GIT更傾向於被使用於分散式模式,也就是每個開發人員從中心版本庫/伺服器上chect out程式碼後會在自己的機器上複製一個自己的版本庫。可以這樣說,如果你被困在一個不能連接網絡的地方時,就像在飛機上,地下室,電梯裡等,你仍然能夠提交文件,查看歷史版本記錄,創建項目分支,等。對某些人來說,這好像沒多大用處,但當你突然遇到沒有網路的環境時,這個將解決你的大麻煩。

同樣,這種分散式的操作模式對於開源軟體社群的開發來說也是個巨大的恩賜,你不必再像以前那樣做出補丁包,透過email方式發送出去,你只需要創建一個分支,向專案團隊發送一個推請求。這能讓你的程式碼保持最新,而且不會在傳輸過程中遺失。 GitHub.com就是一個這樣的優秀案例。

有些謠言傳出subversion將來的版本也會是基於分散式模式。但至少目前還看不出來。

二. GIT把內容按元資料方式存儲,而SVN是按文件:

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

三. GIT分支和SVN的分支不同:

分支在SVN中一點不特別,就是版本庫中的另外的一個目錄。如果你想知道是否合併了一個分支,你需要手動執行像這樣的指令svn propget svn:mergeinfo,來確認程式碼是否被合併。感謝Ben同學指出這個特徵。所以,常常會發生有些分支被遺漏的情況。

然而,處理GIT的分支卻是相當的簡單有趣。你可以從同一個工作目錄下快速的在幾個分支間切換。你很容易發現未合併的分支,你能簡單而快速的合併這些文件。

四. GIT沒有一個全域的版本號,而SVN有:

目前為止這是跟SVN相比GIT缺少的最大的一個特徵。你也知道,SVN的版本號碼實際上是任何一個對應時間的原始碼快照。我認為它是從CVS進化到SVN的最大的突破。因為GIT和SVN從概念上就不同,我不知道GIT裡是什麼特徵與之對應。如果你有任何的線索,請在留言裡奉獻出來與大家分享。

更新:有些讀者指出,我們可以使用GIT的SHA-1來唯一的識別一個程式碼快照。這個並不能完全的取代SVN裡容易閱讀的數字版本號。但,用途應該是相同的。

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

GIT的內容儲存所使用的是SHA-1雜湊演算法。這能確保程式碼內容的完整性,確保在遇到磁碟故障和網路問題時降低對版本庫的破壞。這裡有一個很好的關於GIT內容完整性的討論 – http://stackoverflow.com/questions/964331/git-file-integrity

GIT和SVN之間只有這五處不同嗎?當然不是。我想這5個只是「最基本的」和「最吸引人」的。

git和svn的區別入門篇

為什麼需要版本控制

git和svn都是程式設計師用來管理程式碼的,如果是一個人開發一個項目,版本控制這個玩意兒根本用不上,對吧。但是呢,在企業中進行開發,一個人負責一個專案的情況幾乎不可能,從需求評審,UI設計,前端開發,後台開發,測試,整個過程都是需要團隊來配合的。這時候呢,版本控制都顯得特別重要。

區別

下面我們來談談這git和svn究竟有什麼不同:

svn是集中式版本控制系統,git是分散式版本控制系統。
這句話相信不知道多少人都聽過,究竟什麼是集中式什麼是分散式?很明顯嘛,就字面意思啊,這麼來說吧,svn就是所有人修改的都是伺服器上的程序,如果有人修改了同樣的部分,那就衝突了。所以呢,一般團隊會約定,對於公共部分的程序,盡量標註出開發人員特有標識,又或者A從上添加,B從下添加。
git就是開發人員創建自己的分支,這個分支就相當於將源碼copy一份在本機上,之後修改的都是本地的程式碼,可隨時拉取伺服器的程式碼進行同步,git可創建無數分支,開發人員只需將自己修改的程式碼提交就可以了,這樣衝突的幾率會小很多。
svn是直接與伺服器進行交互,git是將專案快取在本地再推送到伺服器。
svn必須在聯網的情況下工作,git可不聯網開發。
svn易衝突,git不易衝突。
svn旨在專案管理,git旨在程式碼管理。
svn適用於多專案並行開發,git適用於單一專案開發。
svn適用於企業內部,由專案經理協調多個專案統籌開發,git適用於透過網路多人開發相同專案。

git和github

造個句體現一下這兩個的關係
mio使用git將專案提交到了github上
也就是說: git是一個工具,github是一個平台。

最後

我不知道以前聽誰說的,寫技術部落格的意義不在於記,而在於授。這句話說的實在有道理,雖然現在寫的這些文字很不專業,看著像是外行,不過我會努力噠

下面是白袍君的補充

把第一條理解到位思想到位了做起來才會有的放矢,其他幾條都是用的時候才能體會到

   1) 最核心的區別Git是分佈式的,而Svn不是分佈的。能理解這一點,上手會很容易,聲明一點Git並不是目前唯一的分散式版本控制系統,還有比如Mercurial等,所以說它們差不許多。話說回來Git跟Svn一樣有自己的集中式版本庫和Server端,但Git更傾向於分散式開發,因為每一個開發人員的電腦上都有一個Local Repository,所以即使沒有網絡也一樣可以Commit,查看歷史版本記錄,建立專案分支等操作,等網路再次連接上Push到Server端。

從上面看GIt真的很棒,但是GIt adds Complexity,剛開始使用會有些疑惑,因為需要建造兩個Repositories(Local Repositories & Remote Repositories),指令很多,除此之外你需要知道哪些指令在Local Repository,哪些指令在Remote Repository。

   2)Git把內容按元資料方式存儲,而SVN是按文件:因為,.git目錄是處於你的機器上的一個克隆版的版本庫,它擁有中心版本庫上所有的東西,例如標籤,分支,版本記錄等。 .git目錄的體積大小跟.svn比較,你會發現它們差距很大。

   3) Git沒有一個全域版本號,而SVN有:目前為止這是跟SVN相比Git缺少的最大的一個特徵。

   4) Git的內容的完整性要優於SVN: GIT的內容儲存所使用的是SHA-1雜湊演算法。這能確保程式碼內容的完整性,確保在遇到磁碟故障和網路問題時降低對版本庫的破壞。

   5) Git下載下來後,在OffLine狀態下可以看到所有的Log,SVN不可以。

   6) 剛開始用時很狗血的一點,SVN必須先Update才能Commit,忘記了合併時就會出現一些錯誤,git還是比較少的出現這種情況。

   7) 克隆一份全新的目錄以同樣擁有五個分支來說,SVN是同時復製5個版本的文件,也就是說重複五次同樣的動作。而Git只是取得文件的每個版本的元素,然後只載入主要的分支(master)在我的經驗,克隆一個擁有將近一萬個提交(commit),五個分支,每個分支有大約1500個文件的SVN,耗了將近一個小時!而Git只花了區區的1分鐘!

   8) 版本庫(repository):SVN只能有一個指定中央版本庫。當這個中央版本庫有問題時,所有工作成員都一起癱瘓直到版本庫維修完畢或新的版本庫設立完成。而 Git可以有無限個版本庫。或者,更正確的說法,每一個Git都是一個版本庫,差別在於它們是否擁有活躍目錄(Git Working Tree)。如果主要版本庫(例如:置於GitHub的版本庫)發生了什麼事,工作成員仍然可以在自己的本地版本庫(local repository)提交,等待主要版本庫恢復即可。工作成員也可以提交到其他的版本庫!

   9)分支(Branch)在SVN,分支是一个完整的目录。且这个目录拥有完整的实际文件。如果工作成员想要开啟新的分支,那将会影响“全世界”!每个人都会拥有和你一样的分支。如果你的分支是用来进行破坏工作(安检测试),那将会像传染病一样,你改一个分支,还得让其他人重新切分支重新下载,十分狗血。而 Git,每个工作成员可以任意在自己的本地版本库开啟无限个分支。举例:当我想尝试破坏自己的程序(安检测试),并且想保留这些被修改的文件供日后使用, 我可以开一个分支,做我喜欢的事。完全不需担心妨碍其他工作成员。只要我不合并及提交到主要版本库,没有一个工作成员会被影响。等到我不需要这个分支时, 我只要把它从我的本地版本库删除即可。无痛无痒。

    Git的分支名是可以使用不同名字的。例如:我的本地分支名为OK,而在主要版本库的名字其实是master。

    最值得一提,我可以在Git的任意一个提交点(commit point)开启分支!(其中一个方法是使用gitk –all 可观察整个提交记录,然后在任意点开啟分支。)

    10)提交(Commit)在SVN,当你提交你的完成品时,它将直接记录到中央版本库。当你发现你的完成品存在严重问题时,你已经无法阻止事情的发生了。如果网路中断,你根本没办法提交!而Git的提交完全属於本地版本库的活动。而你只需“推”(git push)到主要版本库即可。Git的“推”其实是在执行“同步”(Sync)。

最后总结一下:

SVN的特点是简单,只是需要一个放代码的地方时用是OK的。

Git的特点版本控制可以不依赖网络做任何事情,对分支和合并有更好的支持(当然这是开发者最关心的地方),不过想各位能更好使用它,需要花点时间尝试下。

以上是GIT 和 SVN 區別詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:jb51.net。如有侵權,請聯絡admin@php.cn刪除