2021-05-12 14:32:11
我為什麼更喜歡用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,我的轉變讓自己欣喜,我甚至覺得我已經融入了開源社群,至少也嚐試過貢獻程式碼,還被原作者接受了,感覺真棒!
GitHub 教學系列文章:
GitHub 使用教學圖文詳解 http://www.linuxidc.com/Linux/2014-09/106230.htm
Git 標籤管理詳解 http://www.linuxidc.com/Linux/2014-09/106231.htm
Git 分支管理詳解 http://www.linuxidc.com/Linux/2014-09/106232.htm
Git 遠端倉庫詳解 http://www.linuxidc.com/Linux/2014-09/106233.htm
Git 本地倉庫(Repository)詳解 http://www.linuxidc.com/Linux/2014-09/106234.htm
Git 伺服器搭建與用戶端安裝 http://www.linuxidc.com/Linux/2014-05/101830.htm
Git 概述 http://www.linuxidc.com/Linux/2014-05/101829.htm
分享實用的GitHub 使用教學 http://www.linuxidc.com/Linux/2014-04/100556.htm
Ubuntu下Git伺服器的搭建與使用指南 http://www.linuxidc.com/Linux/2015-07/120617.htm
相關文章