git與svn的區別簡介【git進階】

    之前有篇文件專門講解了git基本命令的用法(git使用手冊,有這些就夠了^_^),以及git代碼合併、代碼衝突解決方法與代碼推向遠端的操作,但是對於一些有SVN使用經驗或使用習慣的同仁來說,彷彿天方夜譚,因爲相比於SVN的線性提交與TortoiseSVN配合簡易的操作,根本用不到命令行去操作,也不必記那麼多的命令,是的,在Windows下SVN確實比git好用一些,但是作爲一名有追求的程序員,不應該將你的開發技能受限於某單一操作系統(Windows),相較於Linux、Unix以及MacOSX等類Unix系統來說,git無疑是最好的選擇,不僅僅如此,在多分支管理、代碼Review、衝突處理與代碼檢視等方面,git也發揮着比SVN更強大的優勢,這篇文章就結合小編本身多年的git與SVN使用經驗,總結出其主要的區別,方便SVN使用者在轉向git使用時,能更好的運用既有的理念,更好更快的上手git。

一、git與SVN切代碼的區別
    將遠端代碼拉取到本地,習慣用“切代碼”,還是比較貼切的,因爲遠端的代碼倉庫可能時刻都會有人向其上提交合並代碼,我們下載代碼到本地,只是下載某個時間點之前的最新代碼,其後的代碼如果我們沒有主動更新到本地的話,本地是沒有的,相當於基於某個點,將倉庫中的代碼切斷,放到本地,所以會用“切代碼”來形容。
    git在切代碼時,首先需要將git的倉庫克隆到本地,用git clone xxx.git命令,git能在多種協議下使用,所以Git URL可能以ssh://, http(s)://, git://開頭,默認情況下,這樣切的代碼爲倉庫中的master分支代碼,也就是git的主分支的代碼,如果直接想切某個倉庫分支的代碼,則克隆是需要加上-b參數,如git clone -b 分支名倉庫地址,這樣就直接切下指定分支的代碼了。切完代碼後,我們可以用git branch來查看本地的分支名,如果本地有多個git分支,則用git branch查看後,帶星號(*)的爲當前分支,如下圖所示,本地有兩個分支:master和develop分支

如果想查看本地和遠端倉庫的所有分支,也可以用git branch -a命令,如下圖所示:

學習git,大家心裏一定要有分支的概念,git使用者往往會在各個分支之間切來切去,大家不要搞暈了^_^.
還有幾點需要着重說明一下:1.git本地會有數據庫來記錄不同分支之間的差分,所以在不同分支之間切換時,本地的代碼也會跟着變換爲相應分支的代碼。2.如果本地代碼有修改,則必須commit之後才能進行分支切換,否則切換不過去的(這也證明了第一點,如果代碼沒有commit,數據庫中是沒有記錄差分的,來回切換可能導致你的修改丟失,git爲了防止這種情況,所以不允許本地有改變的情況下切換分支)。

    關於創建新分支操作,請參見前篇文章:

git使用手冊,有這些就夠了^_^

    SVN的切代碼,相信大家一定不陌生,直接用TortoiseSVN右鍵,checkout就可以將遠端下載到本地,詳細的就不做具體介紹,但是要特別注意一點:SVN的checkout和git的checkout命令是兩個完全不同的操作,git的checkout是轉換分支用的,可以將本地的其他分支切換到當前分支,例如當前分支爲master,如果用git checkout develop,則當前分支變爲了develop,可以用git branch命令驗證。

二、git與SVN代碼提交遠端時的區別
    這裏,大家需要知道git與SVN的另一個巨大的區別,那就是git支持離線commit代碼,而SVN不支持,SVN在commit代碼時,必須與倉庫是網絡相通的,否則是提交不成功的,而git只需要在向遠端push是和倉庫網絡相通就可以了,其他時刻,本地操作都基本可以不與倉庫網絡相通。這裏大家不好理解,我可以舉個例子:假如現在有兩個功能需要你去開發,不巧的是此時網絡出現問題,本地與倉庫網絡不相通了,如果用SVN開發,那麼當你開發完第一個功能後,此時你需要commit提交該功能的代碼,但是由於網絡不通,因此你必須等待網絡通了後,提交完這部分代碼,然後才能繼續開發第二個功能,這中間就浪費了很多時間(當然,你也可以將兩個功能的代碼開發在一塊,然後等網通了後一股腦提交到遠端,但是有追求的程序員是不會這麼幹的,這麼做一來在看log查問題時不好找,二來如果有代碼review的人,在review代碼時,功能耦合性高,增加一定的複雜性,而且好多公司要求單功能提交代碼,不允許多個功能一次性提交的,建議大家按功能提交代碼,並寫好提交log,爲人爲己都方便^_^);但是假如你用的是git,情況就會不一樣,當你開發完第一個功能後,你大可放心的commit提交代碼,然後繼續開發第二個功能,完了後繼續commit代碼,開發完兩個功能並commit後,可以查看提交log,用命令git log -l 5查看近5次的提交記錄,能開到兩個功能的提交記錄,等網通了之後,用git的push命令,將這兩個功能的提交推向遠端,這樣就在無網的情況的單功能提交了兩個不同的功能代碼。
    由此可見,git在本地對代碼的修改與commit是有單獨記錄的,所以,大家在預研開發與測試開發時,可以大膽的進行代碼的commit,將開發的不同功能分開,且不會對遠端倉庫造成影響。
    在提交代碼時,如果遠端已經有人提交過代碼(也就是本地代碼不是最新的),則SVN會在提交時彈出個dialog讓用戶點擊更新,如果有衝突得先處理完衝突,然後才能提交到遠端倉庫;而git則有各種各樣的方法來完成更新並提交代碼,這裏簡單介紹兩種:1. git自動合併法,也就是在向遠端推代碼前,先進行pull更新,此時,如果遠端有人已經提交過代碼,則git會根據遠端提交時間與本地提交時間(本地commit的時間,非push的時間)排序,並自動合併在此之間變化文件的版本更新,並單獨作爲一次提交,這就是爲什麼如果我們直接將本地代碼push到遠端時,查看提交log偶爾會出現一版類似Merge xxxxx to xxxxx的提交,但是這種方法在出現衝突時比較難處理,而且代碼的提交log不利於複查與提交跟蹤,所以自動的東西總不是那麼理想。 2. 變基法,這種方法是當我們pull代碼後,發現本地代碼不是最新的了(本地代碼落後於遠端),此時可以找到遠端最新一版提交的提交碼(一串哈希值),然後用命令git rebase xxx將本地的代碼拉到最新,然後提交,這樣自動生成的那版類似Merge xxxxx to xxxxx的提交就會自動消失。 3. 使用cherry-pick方法,該方法也是我一直在用和推薦的方法,具體使用如下:在開發前將本地開發分支代碼拉取到最新,然後基於該最新代碼,在本地創建一個臨時分支,並切換到該臨時分支上,然後在該分支上開發,開發完成後正常commit,並記住此次提交commit的提交碼(哈希碼),此時,將本地分支切換到開發分支上,並再次更新開發分支,防止遠端有人提交過代碼,然後通過cherry-pick後面跟哈希碼,將臨時分支提交的那版代碼合到開發分支上(注:git其實是根據差分合並的),然後向遠端push本地的開發分支。以上衝突的處理,可參見前篇git的相關文章。

三、git與SVN更新代碼的區別
    git更新代碼用的命令是git pull,也可以用git fetch命令,這兩個命令的區別在於拉取到的遠端代碼是否與本地代碼進行merge,在分支管理開發中,大部分都用git pull更新要合併的分支,然後將已經開發的分支上要合併的代碼cherry-pick過來,或用其他方法進行修改到合併分支上,然後提交到遠端,git功能比較強大,這個根據個人經驗與喜好進行操作。
    SVN更新代碼直接用Update進行更新,這裏不做多說,相信大家都知道。

四、git與SVN代碼提交標識的區別
    git每提交一版代碼,都會生成一串唯一標識該版提交的哈希碼字符串,該字符串唯一標識了在該git倉庫中的一次提交。
    SVN的每一次提交,都是一次整型的累加,比如最新一版提交是#12345,則下一版提交就是#12346,以此類推。
    用TortoiseGit和TortoiseSVN可以查看提交歷史,我們可以發現,SVN是線性的,而git可以更明顯的看出其非線性視圖。

五、git與SVN的更多區別,以及更多git的高級用法,後續......


總結:該篇文章主要介紹了git與SVN的一些基本的區別,更主要的介紹了git的一些詳細用法,希望對大家有幫助,也希望各位同仁共同學習,共同探討,相互進步^_^.

我的公衆號,歡迎關注交流學習進步


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章