昨天講的已經是 Linter 跟 Formatter 了,今天來講另一個,沒有它不知道怎麼活的工具 - Git
沒有 Git 的時代,完全可以用我早期整理履歷的悲劇來說明:
基本上,我覺得自己有押一個時間上去,已經很棒了XD
可以看到同一種檔案會有很多個 「版本」,目的不外乎是留下紀錄,並查看不同版本之間的差異。
只是,每次要產生一個新的版本,如果都要這樣土法煉鋼,不斷複製,一方面很麻煩難以管理,另一方面還很佔系統空間。
Git 是一個分散式版控系統(Distributed Version Control),「分散式」代表的是,每個人都可以 clone
一個完整的專案到本地端,雖然還是有一個遠端的 server 負責管理,但除非需要 pull
或者 push
,否則甚至可以離線使用 Git。
版控則是 Git 的重頭戲:
add
、commit
、push
等指令,可以將檔案編入新版本branch
、checkout
可以建立分支並在中間切換merge
、rebase
則可以將不同分支整合reset
可以跳到指定的版本基本上想得到的功能都有,而且使用 CLI 輸入指令非常方便。
如果傾向使用 GUI 來操作 Git,也可以使用像 SourceTree 這樣的工具,因為能夠將複雜的 branch 都畫成圖,有時候更容易一眼看出現況,要做 rebase
或 reset
等操作時,有個畫面可以看比較不會心慌慌。
Git 與其它版本控制系統(比如 Subversion 等)最主要的差別是如何處理資料的方式,其他大部分的系統是紀錄一連串檔案更改的資訊,比如檔案 A 變成 A1 中間的差異,A1 到 A2 中間的差異,可以想像隨著編輯修改次數增加,檔案庫會愈來愈大。
Git 則完全不是這樣,它把資料視為小型檔案系統的一組快照(Snapshot)。每次 commit 時,Git 會紀錄下你所有目前檔案的樣子,並且參照到這次快照中。為了講求效率,只要檔案沒有變更,Git 不會再度儲存該檔案,而是直接將上一次相同的檔案參照到這次快照中。
常見的 GitHub 或者 GitLab,都是基於 Git 的程式碼控管平台,可以透過 git push
推送程式版本到這些平台統一管理,或者透過 git clone
從平台複製一份完整的 Git 專案下來。
比起自己用 Git 來管理,團隊使用 GitHub 這種控管平台更方便的是:
學習曲線高,雖然日常工作需求很簡單,但遇到衝突或需要處理多個 branch 通常都不容易。
最適合的必然是團隊協作,因為 Git 在處理檔案衝突是很便利的,如果兩個人沒有剛好改到一樣的地方,甚至不需要處理,Git 自己就幫你 merge 起來,不用擔心兩邊打架。
當然如果是自己獨立作業,用 Git 的好處就轉變為版本紀錄了,畢竟我們常開玩笑:
自己寫的 code,過三個月就不記得了
這時如果有乖乖用 Git,認真切 branch、認真寫 commit message,就可以知道每一個版本各自在解決什麼問題,不會為過去的自己感到困惑。
Git 為工程師帶來的方便性真的很大:
checkout
一個新的 branchstash
目前的進度merge
或 rebase
處理工作上真的沒有 Git 無法活,雖然偶爾與同事 commit 衝突,解起來常常膽顫心驚,深怕不小心 merge 錯誤,不過隨著一次次經驗累積,總是慢慢能掌握到技巧(就是永遠都比同事早一點 commit)。