From svn to git 你要知道的東西
最近團隊項目準備從svn往git遷,于是做了一些相關的了解,發現svn跟git還是有很多不一樣的,下面寫了一些個人理解。
核心區別
分布式 vs 集中式
- git是分布式版本管理,也就是本地即完整的倉庫,包括所有的提交,分支,標簽等,而且提交,分支等操作都是在本地進行,與遠程倉庫只是相互同步的關系
- svn是集中式版本管理,本地只是遠程倉庫的某個鏡像,比如處于某個分支,某個版本,但不保存其他版本信息,提交或者建分支等操作都是要連接遠程倉庫的。
這是兩者最根本也是最核心的區別,如果理解了這個區別,就會很容易理解其他比如下面說道工作流程等的不同。為了方便理解,這里舉個不太恰當的比喻,svn 中本地和遠程的關系相當于我們瀏覽器打開網站和該網站的服務器的之間的關系,我們本地只是狀態,而我們要提交修改或切換頁面都是通過與服務交互進行的。而 git中本地和遠程的關系相當于兩臺服務器之間的關系,兩者都能獨立完成操作,兩者之間需要的只是同步。下圖為git和svn本地和遠程之間關系的示例 圖:
工作流程區別
理解了上面的原理上的不同,就可以理解工作流程的不同了,svn是本地修改,遠程提交,而git則是本地操作,遠程同步,這里的操作包括修改,提交,分支操作等。
工具的區別
svn更傾向于GUI工具的使用,而git更傾向于命令行工具的使用,當然這兩者也不是完全是死的,比如你覺得git命令行不直觀的話,也可以使用一些GUI工具,比如windows上安裝的git本身自帶GUI工具,甚至還有喪心病狂的 TortoiseGit 工具。
命令上的區別
add
很多剛從svn遷到git的同學會很困惑,為什么每次commit之前都要add一下。事實上,在git后續的版本就增加了git stage命令,其作用跟之前版本的git add完全一樣,就是官方為了強調,git add的作用是將修改的文件加到暫存區(stage),而git commit的時候只會提交在暫存區的修改,也就是說,暫存區就是本地修改和commit之間的緩沖,而這樣做的好處按我的理解有2個:
- 分次緩存,方便review:如果你跟我有一樣的習慣,就是提交之前都會review一下自己修改的代碼,那么git add是可以方便我們進行代碼review的,每次我完成一部份相對完整或者獨立的修改之后,我會reviwe完修改之后就執行git add,將這部分修改加入緩存區,而當我后面又做了一些修改要review的時候,我就可以只關心修改了但未add的文件。不然的話,要么每次commit的文件都很多,要么commit次數很多,很亂。
- 方便回退:git一旦commit了,要回退是很麻煩的,只是本地commit的話還有得救,已經同步到遠程的話,就只能弄多一個revert的commit才能進行回退,而git add 是很方便回退的。
PS: 當然,如果你覺得上面說的東西都沒卵用,那么可使用git commit -a -m命令直接實現git add .+git commit -m的效果(注意當有文件增刪的時候不行,還是要先add一下)
checkout
svn上checkout跟git的checkout是不同的,git上與svn checkout對應的命令是 clone,而git上checkout的作用分支切換或者代碼還原。