我一開始使用git的時候,其實是反彈的。因為比起SVN,git實在有夠雞肋。也不能說git無用,但我真的分辨不出從SVN換到git的理由是什麼。直到有一個較有慧根的同事敎了我一些基本操作,讓git的學習曲線比較上升了以後,才漸漸發覺到git的可貴,有點覺得Linux真的造福了寫程式的人們。
git可貴在哪哩? 他是免費的..bala bala....。很多git的優點,一堆blog都有在說明,因此我用一些例子引述我覺得git好在哪裡。
狀況一:過去常使用tar的方式來切換不同版本,搞得硬碟裡一堆類似名稱的檔案,還要常用比對軟體來確認版本差異,這反而徒增錯誤的發生。
所以如果你有很多版本需要切換,直接就使用git checkout吧!很多人不懂得使用這個,是因為不常去使用git branch,以及不習慣常git commit。只要是可以打出log的改動,我都會直接commit,哪怕是只改一行。如果目前有改了一堆東西但都還沒commit,但是又要切到其他版本。可以用git stash把所有東西都先放給git管,當你作完後,再使用git stash pop把東西拿出來。這樣子,無論做什麼操作,都是在git控制範圍內,不會需要一直比對,一直確認某包src是在哪個版本,當事情一忙,錯誤就會產生。
狀況二:現在公司內,因為職務輪調,轉到其他部門。但是我過去開發的模組,如果使用SVN管理,而部門間的server又不同,怎麼辦?我的過去開發的歷史就要從此終止嗎?哭哭!
別怕,git可幫你!svn2git這個工具可以幫你把SVN管理的任一URL路徑,轉為單一的git repository。
svn2git http://path/to/svn/dir --rootistrunk
如果是想要同步SVN上面的版本到git上。就是再使用svn2git,然後在舊版本的git repository上利用git remote add 來加入新版本的remote路徑。再使用git fetch,將新版本與舊版放在一起,git會自動找尋到SVN上相同的版本然後產生一個branch。由於git不需架server,而且是分散式。無論你調職到哪裡,svn2git後都可以繼續使用你過去辛苦建立起來的東西。
狀況三:公司內部可能因為平台差異,或是客戶差異,導致分部門來處理同一份來源的code。但是常常遇到A部門與B部門出現相同問題,變成花了原本未分出部門前的2倍以上的人力在解相同的問題,讓人事成本成倍數增加同時也讓加班時數與怨念指數增加。不好好管控版本簡直就是公司衰敗的開始。
不同部門可能使用的server是不同的,甚至沒使用任何VCS。但如果都使用git,可以幫助持續的紀錄兩邊版本差異,也許有一天,兩個部門需要合併?或是project需要合併?這時後可以使用git remote add,把分出去多年的src,利用git fetch把兩條線放進同一個git repository。這樣就可以針對某個問題,使用git cherry-pick,把其他部門以解過的問題,直接利用版本層面來解決,而不需再花費更多人力進去看src來解。這樣節省的時間會非常驚人。
狀況四:我的研發團隊分工很細,介面都訂得很清楚,所以通常部門間不會有source code的開放。SVN可以用export propetise的方式連結。git該怎麼做?
git本身帶有git submodule的方式,可以把其他的repository放進來。所以可以把各部門產出的東西使用git管理,然後建置的時候可以用submodule取得各部門產出的東西。這樣子從開發到建置測試,都可以用git做管理,明確知道哪些版本是這次測試的版本。
或是也可以採用Android在使用的repo這個用python寫的工具,他利用git原本就有的hooks與一些巧妙的機制,達成可以管理很多個git,而且比submodule好用許多,我目前是使用repo來管理所有git repository的。
所以我認為git能帶來最大的優點,就是無論發生什麼事(調職、離職、畢業、server掛掉...),版本都不會再中斷了。直到很久很久以後,你都能看到自己過去開發的一切,甚至還可以繼續的開發你很久很久都沒再碰的東西。只要你採用了git,你現在開始寫的code都開始有了歷史,你就在寫自己的歷史。