Git 全景課 / 第一部分 建立心智模型 · M0
M0 為甚麼需要版本管理
學 Git 的命令之前,先弄清楚它要解決甚麼問題。問題清楚了,每條命令就只是工具。
學完本單元,你能夠:
- 說出版本管理要解決的三個問題;
- 解釋「快照」和「差異」兩種記錄方式的分別;
- 比較集中式和分散式版本管理,並說明分散式為甚麼仍需要「單一正本」;
- 分清楚 Git 和 GitHub、備份和版本管理。
1「最終版_v3_真的最終」 The three problems
幾乎每個人都試過這樣管理檔案:每改一次就另存一份,在檔名後面加上 _v2、_final、_改。檔案少的時候還能應付,但很快就會遇到三個問題:
- 回到過去:「上星期那個能用的版本」是哪一份?那一版和現在差了甚麼?
- 知道誰改了甚麼、為甚麼改:這一段是誰刪的?當時的理由是甚麼?
- 多人同時修改而不互相覆蓋:兩個人各自改了一份,怎樣合併成一份,而不漏掉任何一方的修改?
這三個問題,就是版本管理系統(version control system)要解決的全部問題。下面用同一個情境,比較「另存新檔」和「用 Git」兩種做法。
重點
做法 A 的資訊全部塞進檔名,而檔名記不下「誰、何時、為甚麼」。做法 B 只有一個資料夾,每次保存都附帶作者、時間和一句說明,這一筆記錄叫 commit(提交)。
2快照與差異 Snapshots vs deltas
要記錄一份檔案的歷史,有兩種思路:
- 差異式:只保存第一版的全文,之後每一版只記「和上一版相比改了甚麼」。要取回某一版,就從第一版開始,把差異一個一個套上去。
- 快照式:每一版都記下「這一刻整份檔案是甚麼樣子」。沒有改動的檔案不會重複保存,只記一個指向舊內容的參照。要取回某一版,直接讀出那一張快照即可。
Git 採用快照式。這是理解 Git 的第一塊基石:每個 commit 都是整個專案在那一刻的完整快照,而不是一串修改記錄。
嚴謹一點
「快照」是 Git 的概念模型。為了節省空間,Git 在打包舊物件時(packfile)其實也會在磁碟上用差異壓縮。但這只是儲存細節,你使用 Git 時看到和操作的永遠是完整快照。M3 會打開
.git 資料夾,親眼看看快照是怎樣存放的。
3集中式與分散式 Centralized vs distributed
版本管理系統還有另一個分別:歷史記錄放在哪裏。
- 集中式(例如 SVN):完整歷史只在一部中央伺服器上。每個人電腦裏只有當前的檔案,查歷史和提交都要連上伺服器。
- 分散式(例如 Git):每個人都把整個倉庫連同全部歷史複製一份到自己的電腦。查歷史和提交都在本機完成,只有和別人同步時才需要連線。
4人人都有完整複本,哪一份才是正本? Single source of truth
分散式帶來一個新問題:既然每個人手上都有完整的倉庫,而且大家可以各自提交,那麼「現在的正式版本」是哪一份?
答案是:由團隊約定其中一份為單一正本(single source of truth,SSOT)。通常是放在 GitHub 或 GitLab 上那個倉庫的 main 分支。其他人的複本都可以自由實驗,但要成為正式內容,就必須經過一道門進入正本。
這就是整門課的主線:讓很多人(和 AI)並行工作,同時讓正本始終受控。第二部分教你在自己的複本裏自由工作,第三部分教你怎樣把改動安全地送進正本。
5容易混淆的對照 Easily confused
Git 與 GitHub
| Git | GitHub(及 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
本單元重點 Summary
- 版本管理解決三個問題:回到過去、知道誰改了甚麼和為甚麼、多人並行而不互相覆蓋。
- Git 的每個 commit 都是整個專案的快照,附帶作者、時間和說明。
- Git 是分散式的:每個複本都有完整歷史,離線也能工作。
- 正因為人人都有複本,團隊要約定單一正本,並用 PR 和審查守住它的入口。
- Git 是程式,GitHub 是託管服務;版本管理不能取代備份。
延伸閱讀
- Pro Git 第 1 章 About Version Control、What is Git?(英文,有繁體中文譯本)
- 有問題?記下來,它很可能也是其他同學的問題 → 學生問題庫