iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
Modern Web

前端技能樹的十萬個為什麼系列 第 29

Day 29 - 為什麼要用 Git

  • 分享至 

  • xImage
  •  

前言

昨天講的已經是 Linter 跟 Formatter 了,今天來講另一個,沒有它不知道怎麼活的工具 - Git

先想一下

  • Git 是在什麼樣的時代誕生的?
  • Git 怎麼解決問題?
  • Git 的優缺點是什麼?
  • Git 適合什麼情境?

Git 是在什麼樣的時代誕生的?

沒有 Git 的時代,完全可以用我早期整理履歷的悲劇來說明:

  1. resume.docx
  2. resume_20170104.docx
  3. resume_english_20170105.docx
  4. resume_20180215_draft.docx
  5. resume_20180219_finished.docx
  6. resume_20180222_finished_finished.docx
  7. resume_20180223_really_finished.docx

基本上,我覺得自己有押一個時間上去,已經很棒了XD

可以看到同一種檔案會有很多個 「版本」,目的不外乎是留下紀錄,並查看不同版本之間的差異

只是,每次要產生一個新的版本,如果都要這樣土法煉鋼,不斷複製,一方面很麻煩難以管理,另一方面還很佔系統空間

Git 怎麼解決問題?

Git 是一個分散式版控系統(Distributed Version Control),「分散式」代表的是,每個人都可以 clone 一個完整的專案到本地端,雖然還是有一個遠端的 server 負責管理,但除非需要 pull 或者 push,否則甚至可以離線使用 Git。

版控則是 Git 的重頭戲:

  • 透過 addcommitpush 等指令,可以將檔案編入新版本
  • 透過 branchcheckout 可以建立分支並在中間切換
  • 透過 mergerebase 則可以將不同分支整合
  • 透過 reset 可以跳到指定的版本

基本上想得到的功能都有,而且使用 CLI 輸入指令非常方便。

如果傾向使用 GUI 來操作 Git,也可以使用像 SourceTree 這樣的工具,因為能夠將複雜的 branch 都畫成圖,有時候更容易一眼看出現況,要做 rebasereset 等操作時,有個畫面可以看比較不會心慌慌。

Git 原理

Git 與其它版本控制系統(比如 Subversion 等)最主要的差別是如何處理資料的方式其他大部分的系統是紀錄一連串檔案更改的資訊,比如檔案 A 變成 A1 中間的差異,A1 到 A2 中間的差異,可以想像隨著編輯修改次數增加,檔案庫會愈來愈大。

Git 則完全不是這樣,它把資料視為小型檔案系統的一組快照(Snapshot)。每次 commit 時,Git 會紀錄下你所有目前檔案的樣子,並且參照到這次快照中。為了講求效率,只要檔案沒有變更,Git 不會再度儲存該檔案,而是直接將上一次相同的檔案參照到這次快照中。

GitHub

常見的 GitHub 或者 GitLab,都是基於 Git 的程式碼控管平台,可以透過 git push 推送程式版本到這些平台統一管理,或者透過 git clone 從平台複製一份完整的 Git 專案下來。

比起自己用 Git 來管理,團隊使用 GitHub 這種控管平台更方便的是:

  • GUI 操作,簡化了許多複雜的指令
  • CI/CD 可以一併在平台上處理
  • Code Review 更容易比對檔案 diff 並留下 comment

Git 的優缺點是什麼?

優點

  • 分散式系統,對伺服器依賴程度低,可離線操作,執行速度快
  • 功能強大,merge、rollback、cherry-pick 等操作都能用幾行指令完成
  • 團隊合作,使用 branch 切開自己的工作環境
  • Commit message 幫檔案、版本註解,容易追蹤與推敲訊息

缺點

學習曲線高,雖然日常工作需求很簡單,但遇到衝突或需要處理多個 branch 通常都不容易。

Git 適合什麼情境?

最適合的必然是團隊協作,因為 Git 在處理檔案衝突是很便利的,如果兩個人沒有剛好改到一樣的地方,甚至不需要處理,Git 自己就幫你 merge 起來,不用擔心兩邊打架。

當然如果是自己獨立作業,用 Git 的好處就轉變為版本紀錄了,畢竟我們常開玩笑:

自己寫的 code,過三個月就不記得了

這時如果有乖乖用 Git,認真切 branch、認真寫 commit message,就可以知道每一個版本各自在解決什麼問題,不會為過去的自己感到困惑。

結語

心智圖放大版

Git 為工程師帶來的方便性真的很大:

  • 要開發新的功能就 checkout 一個新的 branch
  • 要暫時切去處理其它事就 stash 目前的進度
  • 與同事 commit 衝突就 mergerebase 處理

工作上真的沒有 Git 無法活,雖然偶爾與同事 commit 衝突,解起來常常膽顫心驚,深怕不小心 merge 錯誤,不過隨著一次次經驗累積,總是慢慢能掌握到技巧(就是永遠都比同事早一點 commit)。

參考資料

Git


上一篇
Day 28 - 為什麼要用 ESLint & Prettier
下一篇
Day 30 - 為什麼要問為什麼
系列文
前端技能樹的十萬個為什麼30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言