我為什么更喜歡用git
之前,我寫了一篇文章《SVN為什么比git更好》,主要是從非常樸實和現實的角度,從一個為全團隊選型的角度,分析了為什么SVN比git更好。但是公私分明,作為我個人來說,我想我還是更喜歡git的。
全分布式設計
分布式計算,早就是這個時代的趨勢和潮流了,為什么版本控制不應該分布式呢?分布式到底有何好處呢?很多書會寫,每個拷貝,都是整個版本庫的鏡像,(這是優點么?),災難恢復比較容易,(因為每個人鏡像的人,都是整個全部版本庫,多少個人克隆,就等同于多少分備份,那么當然災難恢復容易,不過這跟我到底什么關系?那是運維的事情),去中心化,(那又怎么樣?寫代碼難道還要民主不成?),這些分布式帶來的好處,感覺都有點隔靴搔癢的感覺。
那么我個人真正從全分布式設計中,獲得的好處是什么呢?我更喜歡創建版本庫,并且保存所有的代碼了。因為任何時候,使用git工作,都是持有整個版本庫,從0開始創建一個項目,也不例外,當你執行git init的時候,就是真正有了一個版本庫了,過程容易的程度,讓人印象深刻。如果,使用SVN,則完全不會這么愉悅,因為是CS架構的,所有你總是要選擇一個Server,就算全本地的場景,你也不得不安裝一個SVN Server的一些軟件,創建完了版本庫,還要網絡連接,還要checkout,即便所有的東西在本地,這個過程也并不迅速。而一旦版本庫建立在了本地,日后想要遷移,恐怕也有得痛苦,因為SVN本身不提供這種遷移機制。git的話則完全不同,一旦你需要傳輸某個項目到某個版本庫,使用remote相關指令,輕松搞定。
git的這種設計,會激發我將一切代碼的目錄,都變成版本庫,反正又沒什么成本,能保證代碼不丟還能記錄版本,何樂不為?
分布式設計的另一個妙處,就是全離線操作,無論是提交代碼,創建分支,切換分支,分支合并,幾乎一切的一切,都是本地操作。所以,只要一臺電腦在手,在任何地方,任何環境,我都可以愉快地寫代碼,在過去的日子,我覺得這似乎并不是什么真實的需求,但是時代發展到了當今,我確實經常帶著電腦到處跑,而且,更加習慣帶著電腦出門了,在今時今日,這已經完全是一個頻繁的需求了。
更強大的功能
以前,在SVN下面,很多東西都被限死了。雖然減少了錯誤的概率,但是毫無樂趣,毫無掌控力,用著很死板。使用了git,就感覺到了很多強大的東西,這讓我愛不釋手。
其中一個能力是分支創建和切換的簡便。以前SVN的分支創建,首先是一個服務器行為,你必須發指令給服務器,漫長的等待,其次,切換分支也是很痛苦的,需要從服務器下載差異,哪怕新創建的分支,執行switch也需要很久的等待。其次,SVN提供了merge tracking技術,如果一個分支經過多次merge操作,恐怕就并不會給出那么喜人的結果了,會變得非常不智能,甚至需要手動填寫精確版本號,才可以正確地合并,所以我們常見的做法是,用完一個分支回歸trunk后,就刪除分支,下次重開,可是開分支真的很耗時,尤其版本庫大的時候,所以,程序員經常偷懶,時常在trunk直接改bug,這其實是冒了風險的。
第二個是改變提交記錄的能力。在SVN,任何東西都是一次提交,創建分支,提交,刪除分支,提交,合并分支,提交,變更代碼,提交,撤銷變更,再提交。會產生很多很多的提交記錄。為了不讓自己的一次變更散落在太多commit里面(提交歷史記錄很不好看),我經常做法是降低提交頻率,這更是冒著很大的風險的。使用了git,就完全不一樣了,我可以隨意提交,甚至運行腳本自動提交,而當我真的想要歸檔的時候,可以使用交互式rebase,將之前的提交都合并成一個,可以挑選一些連續的提交,將他們按照功能劃分后,合并成一個,這樣就會產生非常清晰而且有意義的提交歷史,并且不會導致代碼丟失。好爽。
git的rebase是我喜歡的另一個功能,因為commit本身已經不是順序自然數了,所以,調整commit的順序,人是無法感知的,只能靠時間戳分清先后,在這種情況下,調整了commit順序如果能讓提交歷史更清晰的話,真的太棒了,rebase就是干這個的,我經常獨立開發一個分支,脫離主干太久,這時候我只要rebase一下主干,下次我的代碼回歸主干的時候,看起來就像是自然而然append到主干最后的幾個提交一樣,完全是線性而且清晰的歷史,再經過我精心合并后,就能產生很美的效果。
強大民主的社區
git的去中心化設計,天然適應于開源社區,因為開源世界里程序員各自獨立工作,互不干擾,又必須要合作貢獻開源軟件,git很好的解決了這個問題,催生出了火爆的github社區,在這個社區,你可以挑選各種你喜歡的項目,fork,研究,貢獻,申請pull request,這完全是一種友好的程序員式的溝通方式,如果你喜歡我的項目,請fork me,如果你想做點什么,請pull request me,如果我認可你的努力,我會accept,這種協作的氛圍,完全異步,不需要過多的溝通,而且禮貌,太喜歡github這樣的社區了。它催生了無數的創造力,解放了生產力。
結論
我想,更多的,resonable的原因,我估計很難想出來了,但是從一開始運用git困難,無法學進去,到被逼著學,學會了的那種喜悅,然后就是日常開發再也離不開git,我的轉變讓自己欣喜,我甚至覺得我已經融入了開源社區,至少也嘗試過貢獻代碼,還被原作者接受了,感覺真棒!