Git 全景課 / 第一部分 建立心智模型 · M0

M0 為甚麼需要版本管理

學 Git 的命令之前,先弄清楚它要解決甚麼問題。問題清楚了,每條命令就只是工具。
約 30 分鐘互動 ×3 · 小測 4 題不需要安裝任何東西
學完本單元,你能夠:
  1. 說出版本管理要解決的三個問題;
  2. 解釋「快照」和「差異」兩種記錄方式的分別;
  3. 比較集中式和分散式版本管理,並說明分散式為甚麼仍需要「單一正本」;
  4. 分清楚 Git 和 GitHub、備份和版本管理。

1「最終版_v3_真的最終」 The three problems

幾乎每個人都試過這樣管理檔案:每改一次就另存一份,在檔名後面加上 _v2、_final、_改。檔案少的時候還能應付,但很快就會遇到三個問題:

  1. 回到過去:「上星期那個能用的版本」是哪一份?那一版和現在差了甚麼?
  2. 知道誰改了甚麼、為甚麼改:這一段是誰刪的?當時的理由是甚麼?
  3. 多人同時修改而不互相覆蓋:兩個人各自改了一份,怎樣合併成一份,而不漏掉任何一方的修改?

這三個問題,就是版本管理系統(version control system)要解決的全部問題。下面用同一個情境,比較「另存新檔」和「用 Git」兩種做法。

互動 1 兩種保存方式

拖動滑桿,逐步經歷一份功課(或一個程式)的生命週期。看看每一步之後,下方的三個問題還能不能回答。

應用線:

做法 A:另存新檔

    做法 B:Git

      問題另存新檔Git
      重點 做法 A 的資訊全部塞進檔名,而檔名記不下「誰、何時、為甚麼」。做法 B 只有一個資料夾,每次保存都附帶作者、時間和一句說明,這一筆記錄叫 commit(提交)。

      2快照與差異 Snapshots vs deltas

      要記錄一份檔案的歷史,有兩種思路:

      Git 採用快照式。這是理解 Git 的第一塊基石:每個 commit 都是整個專案在那一刻的完整快照,而不是一串修改記錄。

      互動 2 取回舊版本要讀多少東西?

      先選記錄方式,再點選要取回的版本。高亮的格子是取回時必須讀取的資料。

      點選任何一格,看看要讀取哪些資料。

      嚴謹一點 「快照」是 Git 的概念模型。為了節省空間,Git 在打包舊物件時(packfile)其實也會在磁碟上用差異壓縮。但這只是儲存細節,你使用 Git 時看到和操作的永遠是完整快照。M3 會打開 .git 資料夾,親眼看看快照是怎樣存放的。

      3集中式與分散式 Centralized vs distributed

      版本管理系統還有另一個分別:歷史記錄放在哪裏。

      互動 3 伺服器出事時會怎樣?

      選擇一種架構,然後模擬兩種事故。

      4人人都有完整複本,哪一份才是正本? Single source of truth

      分散式帶來一個新問題:既然每個人手上都有完整的倉庫,而且大家可以各自提交,那麼「現在的正式版本」是哪一份?

      答案是:由團隊約定其中一份為單一正本(single source of truth,SSOT)。通常是放在 GitHub 或 GitLab 上那個倉庫的 main 分支。其他人的複本都可以自由實驗,但要成為正式內容,就必須經過一道門進入正本。

      單一正本與複本 三個人各自有完整複本,可以自由提交;改動要經過「PR 與審查」這道門,才能進入位於中央的正本 main。 正本:origin / main GitHub/GitLab 上 PR + 審查 你的複本 完整歷史 · 自由提交 同學的複本 完整歷史 · 自由提交 AI agent 的複本 完整歷史 · 自由提交 大家從正本取得最新內容 (fetch/pull,M9)

      這就是整門課的主線:讓很多人(和 AI)並行工作,同時讓正本始終受控。第二部分教你在自己的複本裏自由工作,第三部分教你怎樣把改動安全地送進正本。

      5容易混淆的對照 Easily confused

      Git 與 GitHub

      GitGitHub(及 GitLab 等)
      是甚麼安裝在你電腦上的程式網上的倉庫託管服務
      負責記錄歷史、分支、合併存放正本,提供 PR、審查、議題、權限
      沒有網絡時照常運作無法使用
      比喻文字處理軟件放文件的共享雲端資料夾,加上審批流程

      不用 GitHub 也可以用 Git;但 GitHub 上的一切都建立在 Git 之上。

      備份與版本管理

      備份(雲端同步、Time Machine)版本管理(Git)
      何時保存自動、定時由你決定,每次提交都是有意義的一步
      附帶說明沒有每個 commit 都有作者、時間和說明
      多人同時修改容易產生「衝突副本」,要人手比對可以合併,並清楚標示衝突之處
      主要用途防止資料遺失管理變化
      常見誤解 「用了 Git 就不用備份。」倉庫放在 GitHub 上的確多了一份異地複本,但未提交的修改、被 .gitignore 排除的檔案,以及大型媒體檔都不在 Git 裏。兩者互補,不能互相取代。

      6課前準備 Before the next module

      下一單元開始動手。請先確認電腦已安裝 Git:

      git --version

      如果顯示版本號(例如 git version 2.4x.x),就已經安裝好。如果沒有,請到 git-scm.com/downloads 下載。macOS 也可以在終端機輸入 xcode-select --install。

      然後告訴 Git 你是誰。每個 commit 都會記下這兩項資料:

      git config --global user.name "你的名字"
      git config --global user.email "you@example.com"

      7小測 Quiz

      1. 以下哪一項不是版本管理要解決的問題?
      2. 關於 Git 的 commit,哪一句最準確?
      3. 在火車上沒有網絡,用 Git 可以做甚麼?
      4. 既然每個人都有完整複本,「正本」是怎樣決定的?

      本單元重點 Summary

      延伸閱讀