git管理工具對比(gitbash、egit、sourcetree)
gitbash是采用指令行的方式對版本進行管理,功能最為靈活強大,但是由于需要手動輸入希望修改的檔案名,是以相對繁瑣。
egit是eclipse的git插件,最為糾結的一個軟體,因為開發時直操作很友善,尤其是有svn開發情節的人更熱衷于這樣,不過egit中有很多bug和不人性化的東西,讓人吐血,是以
一句話egit并不能解決所有git問題,開發時必須部分依賴于其他git管理工具。一會一一列舉。
sourcetree是最近應用的一個軟體,一句話概括,既有gitbash的指令行,又有egit的圖形化管理,使用者界面很人性化,eclipse+gitbash完全可以應付版本管理。
那麼下面我結合項目中開發遇到的問題一一講解一下:
<一>egit之我見:
egit最大的好處是內建在eclipse裡面,對于代碼修改後送出很友善,其中我最常使用的部分是:
(1)簡單的commit,pull,push。
(2)git repository(看資源庫視圖)(包括建立分支,切分支,合并分支)
(3)工程reset hard(強制覆寫本地版本),一些特殊情況會有問題。
(4)工程checkout到某一個分支,可以看當時的檔案。
(5)工程show in history (檢視工程變更曆史),沒有時分秒,很不爽。
其他的功能我用的不多,因為egit确實有很多bug,犯過血淋淋的錯誤。
這裡解釋一下,為什麼第一條我要加上”簡單的”,因為很多時候沒有pull下來,或者沒有push上去,提示的資訊很粗,有時候甚至誤以為送出,發現過很多問題,是以如果确定現在沒人和你同時改同一個檔案,用egit還是很爽的。
<二>gitbash之我見:
一般我主要通過指令行進行pull push 還有 status的操作,這個詳見我前一篇文章
《》,指令行用好了很是很不錯的,除了那種需要手寫檔案名的時候,比較不爽,一兩個還可以,多了就吐血了。
<三>sourcetree之我見:
這個是我最近才發現了一個很好的工具sourcetree,可以說sourcetree是egit和gitbash的合體,既有圖形化界面又有git指令行。
(1)基本的commit、pull、push都擁有,而且一旦發生錯誤的時候提示很準确。
(2)基本的分支管理業有,最挫的egit删除遠端分支是假删除,sourcetree完美解決了這個問題。
(3)擁有egit中的reset(重置)和checkout(簽出)兩大功能,而且更加穩定。最令我懷疑的egit的reset hard也有報錯的時候,哎。sourcetree還是很穩定的。
(4) 那麼最近用sourcetree,發現了一個很強大的功能,就是“丢棄”這個功能,和checkout其實原理是一樣的。不過圖形化界面肯定比較友善了。這裡具體解釋一下這個功能:
換句話說,你改了一批檔案,如果想送出一部分,保留一部分,無疑指令行最麻煩。
然後你不滿足,其中有幾個檔案你還想復原,不想改了。那麼sourcetree最容易。
這裡需要注意一下指令行中checkout 是指未add的,那麼可以復原到最近的線上的commit狀态。如果add之後又修改,那麼會復原到add之後的狀态。
這一個原理,在source展現的更明顯,如下:
a. 首先我先将修改後的personriskbase.jsp拖到緩存區中(1)。
圖(1)
b. 然後再次修改,發現下面的工作區中也有這個頁面了(圖2)。
(圖2)
c. 現在就可以對此檔案進行丢棄了,如果将下面檔案丢棄(checkout),那麼該檔案将變為緩沖區中的檔案,如果将緩沖區檔案丢棄,實際上回到了最近的commit版本了(reset操作)。
這裡注意,如果該檔案commit了,那麼checkout實際上回不到commit之前的版本的,需要reset。下面詳細介紹一下reset指令。
(5) 對于reset功能的應用。這裡先普及一下git理念的事:
a. 明确一點,每一次commit都是對應着一批操作而不是對應一個檔案。
這點和svn的設計理念完全不一樣。
這也造成了一個必然的結局:svn的分支存的是一個工程,是以每簽出一個分支實際上都是簽出一個工程。
而git的分支存的是修改的記錄,是以每簽出一個分支,實際上都是對原工程的一次覆寫。
b.在開發過程中大家可能會遇到這樣一個問題:pull之後,會出現很多别人送出的代碼需要你本地再重新送出一次,那麼這個原因是這樣的,當然這個是我個人的了解:git會把每一次pull結果做兩個處理:
b1.如果pull之後,本地沒有任何問題,那麼不需要再次送出别人修改的東西了,隻需要繼續你的修改,push就可以了(正常情況下一版都是這樣)。
b2.如果pull之後,本地有問題,大部分情況是沖突的情況,那麼git會把本次當做一次不成功的pull(那麼通俗的來講,git會認為,你認為不成功,那麼你把這次版本按照你的想法改一下,再送出吧),是以你做完删減之後,需要把剛才别人的東西再提一次作為一個新的commit。
(6) 對于checkout某一次送出,sourcetree也很人性化,會給出很人性化的提示。注意checkout之後,你的工程目前不屬于任何分支,不過可以基于此重新建立一個分支,很友善。
總結一下:這裡隻列出了一些關鍵的問題和不同點,當然工具的選擇因人而異。大家可以在工作中慢慢體會,如果有問題歡迎大家提出,給我寶貴的意見。(待續)