GIT和SVN之間的區別及基本操作對比

2021-07-15 23:08:13 字數 4293 閱讀 7652

1. git和svn之間的五個基本區別

1)git是分布式的,svn不是:

這是git和其它非分布式的版本控制系統,例如svn,cvs等,最核心的區別。如果你能理解這個概念,那麼你就已經上手一半了。需要做一點宣告,git並不是目前第乙個或唯一的分布式版本控制系統。還有一些系統,例如bitkeeper, mercurial等,也是執行在分布式模式上的。但git在這方面做的更好,而且有更多強大的功能特徵。

git跟svn一樣有自己的集中式版本庫或伺服器。但,git更傾向於被使用於分布式模式,也就是每個開發人員從中心版本庫/伺服器上chect out**後會在自己的機器上轉殖乙個自己的版本庫。可以這樣說,如果你被困在乙個不能連線網路的地方時,你仍然能夠提交檔案,檢視歷史版本記錄,建立專案分支等。

2)git把內容按元資料方式儲存,而svn是按檔案:

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

3)git分支和svn的分支不同:

分支在svn中一點不特別,就是版本庫中的另外的乙個目錄。如果你想知道是否合併了乙個分支,你需要手工執行像這樣的命令svn propget svn:mergeinfo,來確認**是否被合併。

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

4)git沒有乙個全域性的版本號,而svn有:

目前為止這是跟svn相比git缺少的最大的乙個特徵。

5)git的內容完整性要優於svn:

git的內容儲存使用的是sha-1雜湊演算法。這能確保**內容的完整性,確保在遇到磁碟故障和網路問題時降低對版本庫的破壞。

2、svn和git基本操作對比

1)倉庫建立初始化

在svn中,倉庫本身的管理和日常應用,使用的是兩套不同的命令。倉庫的建立和備份維護等使用的命令是 svnadmin, 使用svnadmin create來建立乙個新的倉庫

在git中,建立乙個新的倉庫,可以在乙個空目錄下,使用git init來實現,它將建立乙個.git目錄用來維護倉庫資料。 

在svn中,建立倉庫的地方並不是你日常使用的倉庫的地方,你需要在別的地方checkout出特定的倉庫路徑作為你的日常工作的目錄。在git中,倉庫所在的目錄也就是你的日常工作目錄,沒有伺服器端和客戶端之分。(嚴格的說 .git目錄才是倉庫,.git目錄外的地方是你的工作目錄,對於bare project來說,只有git目錄下的內容,工作目錄離得內容還是要checkout出來的)

2)checkout倉庫

在svn中,使用svn checkout(co)來checkout本地或遠端倉庫的** 

而對於git來說,儘管也有checkout命令,但是由於你需要在本地擁有倉庫,所以通常從伺服器上checkout**的第一步是使用git clone來獲取乙個倉庫的拷貝,預設的git clone操作同時還會checkout乙份遠端倉庫上當前active的分支 

在svn中,其倉庫的管理形式決定了你可以只checkout倉庫中特定路徑/分支下的子目錄,而不是整個倉庫,而git只能checkout整個分支。 

3)將檔案納入版本管理

在svn中,使用svn add,這樣在以後的commit過程中,每次在提交資料之前,svn都會自動根據這些add過的物件的修改情況,構建乙個commit tree。 

在git中,因為存在index的概念,要將乙個檔案納入版本管理的範疇,首先是要用git-update-index –-add將檔案納入index的監控範圍,只有更新到index中的內容才會在commit的時候被提交。另外,檔案本身的改動並不會自動更新到index中,每次的任何修改都必須重新更新到index中去才會被提交。 當然,通常會用git add這樣的封裝指令碼來呼叫git-update-index

4)檢查當前狀態

svn status 可以顯示當前working tree的檔案修改狀態 

在git中 git status 命令顯示當前index的狀態和working tree的狀態。

5)提交檔案

git commit操作在git命令中屬於相對簡單的,需要注意的一點就是上面提到的,只有index中的內容才會比提交。

6)刪除檔案

在使用svn rm刪除乙個目錄的時候,因為每個目錄下都存在.svn目錄,記錄了這個目錄於伺服器端倉庫相關的資訊,所以在commit之前,目錄裡的其它檔案會被刪除,但是目錄及其子目錄並不會被真正刪除,只有commit以後,目錄才會被刪除。

在git中,同樣,使用git rm 刪除檔案。但是git對目錄的處理有些奇怪,如果某個目錄下的所有檔案都被刪除以後,該目錄就會被自動刪除,也就是說你無法保留乙個空的目錄。你也無法新增乙個空目錄到倉庫裡。也就是說git 自動忽略空目錄,不知道這樣做的目的是什麼?

7)檢視log

svn log命令基本上就是用來檢視版本提交時的所填寫的log資訊 

git log可以做的事情會多很多,畢竟git log是對底層核心命令的再包裝,通過它,不僅可以檢視log資訊,還可以輸出特定版本的具體變更內容等等資訊。

8)版本回溯

在svn中,不提供任何從倉庫中刪除物件的機制,任何的修改都會導致版本的遞增,所以,如果想丟棄乙個修改,你需要做的事是反向diff你的修改,再提交乙個新的版本。 

在git中提供了重置committed tree物件索引的機制,所以,你可以通過例如git-reset這樣的操作將當前分支的版本恢復到以前的某個狀態。經常看見的例子就是回溯乙個版本,然後修改內容,再次提交。不過這樣做搞不好很容易出問題。包括在git-push之類的操作時會被reject,需要強行push之類的。

如果只是想放棄乙個修改,git的文件推薦使用git-revert操作,這個操作基本上和svn的思路是一樣的了,就是提交乙個新的版本將需要revert的版本的內容再反向修改回去,版本會遞增,不影響之前提交的內容。

9)放棄當前修改

在svn中,使用svn revert對目錄或檔案操作都可以將當前工作樹上特定路徑的修改恢復到伺服器上的版本,放棄當前的修改。 

git中,對特定檔案使用不帶其它引數的git checkout命令可以將檔案恢復到index中的狀態,如果你想恢復的特定的版本,那麼類似: git checkout head file這樣的操作,將檔案恢復到head tree即最近一次提交的狀態。

不過git checkout有個問題,不知道是否是故意這樣設計的,就是即使用git rm刪除的內容,如果沒有提交,git checkout以後也會恢復,包括它在index中的狀態。這點有些不理解。 理論上index上已經記錄這個刪除操作,不應該恢復才對。

git中還有一種辦法,可以快速徹底的放棄自從上次commit以來的所有變更,git reset –hard head

10)**合併

git merge能夠自動記住以前merge過的位置和狀態,這個比較容易理解,因為通過每個分支的head commit可以跟蹤它的物件索引關係。另外,因為其物件管理機制的原因,只能以commit為單位,merge整個分支的所有修改。不能有選擇的merge部分路徑下的修改。merge的時候要求index和head是一致的,如果merge成功,內容會直接commit,而工作樹上的修改仍會保持。(如果失敗,會在工作樹上將需要merge的內容和你已有的修改合併,大概不是你所希望的,所以最好不要這樣做)

merge特定分支的特定版本之前的所有修改,可以通過merge那個版本對應的rev來實現,merge某一段版本區間的修改,考慮到commit需要完整的**樹關係,估計靠git merge來做是沒有辦法了,需要自己diff / patch**來實現

svn的merge操作不會記住它的merge歷史,換句話說,你可以多次merge同乙份**,但是他的好處是你可以自由的選擇merge哪一部分、哪一段版本之間的**,應該說他基本等同於是diff和patch的組合。不過因為svn沒有index的概念,所以merge的操作會和當前working tree上的修改合併在一起。

關於歷史資訊方面,因為svn的merge實際是patch檔案內容本身,所以,不同分支上的歷史資訊不會在merge以後的主幹上體現出來,而git的merge,如果沒有衝突的話,實際是merge commit樹的繼承關係,所以,所有的歷史資訊在merge以後的commit中都能夠被索引到。

11)獲取單純的**

在svn中,如果不需要任何歷史資訊,只想要某個版本純粹的**(經常會有這種需求,這樣做本地資料比較小) 那麼,使用svn export命令即可以實現。

在git中,似乎沒有這樣的命令,不過,由於git的本地倉庫資訊完全維護在project根目錄的.git目錄下,(不像svn一樣,每個子目錄下都有單獨的.svn目錄)。所以,只要clone,checkout然後刪除.git目錄就可以了

Git 和 SVN 之間的基本區別

如果你在讀這篇文章,說明你跟大多數開發者一樣對git感興趣,如果你還沒有機會來試一試git,我想現在你就要了解它了。git不僅僅是個版本控制系統,它也是個內容管理系統 cms 工作管理系統等。如果你是乙個具有使用svn背景的人,你需要做一定的思想轉換,來適應git提供的一些概念和特徵。所以,這篇文章...

Git和SVN之間的區別

1.git是分布式的,svn不是 分布式相比於集中式的最大區別在於開發者可以提交到本地,每個開發者機器上都是乙個完整的資料庫。這是git和其它非分布式的版本控制系統,例如svn,cvs等,最核心的區別。如果你能理解這個概念,那麼你就已經上手一半了。需要做一點宣告,git並不是目前第乙個或唯一的分布式...

Git 和 SVN 之間的區別

把第一條理解到位思想到位了做起來才會有的放矢,其他幾條都是用的時候才能體會到 1 最核心的區別git是分布式的,而svn不是分布的。能理解這點,上手會很容易,宣告一點git並不是目前唯一的分布式版本控制系統,還有比如mercurial等,所以說它們差不許多。話說回來git跟svn一樣有自己的集中式版...