1. 以下哪一個是「沒有使用版本控制」時常見的問題?
2. Git 屬於哪種類型的版本控制系統?
3. Git 記錄版本的方式是?
4. Git 的「暫存區(Staging Area)」的作用是什麼?
5. Git 專案的版本歷史儲存在哪裡?
你有沒有遇過這種情況:專案資料夾裡躺著 project_final.zip、project_final_v2.zip、project_final_真的最後一版.zip?或是改壞程式碼後,想回到「昨天那個可以跑的版本」,卻發現根本不記得改了什麼?
這就是版本控制要解決的問題。
沒有版本控制的日常災難
讓我們看看沒有版本控制時,開發者的日常:
my-project/
├── index.html
├── index_backup.html
├── index_backup_0115.html
├── index_old.html
├── index_new.html
├── index_final.html
└── index_final_真的最終版.html
這種「人工版本控制」有幾個致命問題:
- 無法追蹤變更:
indexbackup.html和indexold.html差在哪?沒人知道 - 無法協作:同事 A 改了
index.html,同事 B 也改了,誰的版本才對? - 無法回溯:「上禮拜那個功能還在的版本在哪?」答案通常是找不到
- 佔用空間:每次備份都是完整複製,硬碟很快就滿了
版本控制系統解決什麼問題
版本控制系統(Version Control System,VCS)就像是程式碼的「時光機」,它能:
- 記錄每次變更:誰在什麼時候改了什麼,一清二楚
- 隨時回溯:想回到任何歷史版本,一個指令搞定
- 支援協作:多人同時修改同一份程式碼,系統幫你整合
- 分支開發:想試驗新功能?開一個分支,不影響主線
集中式 vs 分散式版本控制
版本控制系統有兩種主要架構:
集中式(Centralized)
代表:SVN、CVS
[中央伺服器]
│
┌─────┼─────┐
▼ ▼ ▼
開發者A 開發者B 開發者C
(只有最新版) (只有最新版) (只有最新版)
Code language: CSS (css)所有版本歷史都存在中央伺服器,開發者只有最新的檔案。
問題:伺服器掛了,大家都不能工作;沒網路,也不能提交變更。
分散式(Distributed)
代表:Git、Mercurial
開發者A 開發者B 開發者C
[完整儲存庫] [完整儲存庫] [完整儲存庫]
│ │ │
└───────────────┼───────────────┘
▼
[遠端儲存庫]
(GitHub 等)
Code language: CSS (css)每個開發者都有完整的版本歷史。沒網路也能提交、查看歷史、切換版本。
Git 是怎麼來的?
2005 年,Linux 核心開發團隊原本使用的版本控制工具 BitKeeper 終止了免費授權。Linux 之父 Linus Torvalds 花了大約兩週時間,寫出了 Git 的第一版。
他設計 Git 時的目標:
- 速度快:Linux 核心有幾萬個檔案,操作必須迅速
- 分散式:不依賴中央伺服器,支援離線工作
- 支援大型專案:能處理像 Linux 核心這樣的超大型專案
- 強大的分支功能:讓開發者能輕鬆建立和合併分支
Git 的核心概念:快照,而非差異
大多數版本控制系統記錄的是「差異」(diff):
版本1 → [+10行, -3行] → 版本2 → [+5行, -1行] → 版本3
Code language: CSS (css)要得到版本 3,必須從版本 1 開始,依序套用所有差異。
但 Git 記錄的是「快照」(snapshot):
版本1: [完整檔案狀態]
版本2: [完整檔案狀態]
版本3: [完整檔案狀態]
Code language: CSS (css)每次提交,Git 都會對所有檔案拍一張「快照」。如果某個檔案沒有變更,Git 不會重複儲存,而是建立一個指向前一版的連結。
這讓 Git 在切換版本時特別快,因為不需要「重新計算」,直接取出快照即可。
Git 的三個工作區域
這是理解 Git 最重要的概念。Git 專案有三個主要區域:
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 工作目錄 │ → │ 暫存區 │ → │ 儲存庫 │
│ (Working │ │ (Staging │ │(Repository) │
│ Directory) │ │ Area) │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
你編輯檔案 準備要提交的 正式的版本
的地方 變更 歷史紀錄
工作目錄(Working Directory)
就是你在電腦上看到的專案資料夾。你在這裡新增、修改、刪除檔案。
暫存區(Staging Area)
也叫 Index。這是一個「準備區」,讓你選擇哪些變更要放進下一次提交。
為什麼需要暫存區?因為你可能改了 10 個檔案,但只想先提交其中 3 個。暫存區讓你能精確控制每次提交的內容。
儲存庫(Repository)
這是 Git 真正儲存所有版本歷史的地方,就是專案根目錄下的 .git 資料夾。每次「提交」(commit),變更就會從暫存區移到儲存庫,成為正式的歷史紀錄。
用生活化的比喻理解
把 Git 想像成一個「遊戲存檔系統」:
- 工作目錄 = 你正在玩的遊戲畫面
- 暫存區 = 「確定要存檔嗎?」的確認畫面
- 儲存庫 = 所有存檔的清單
你可以隨時讀取任何存檔(checkout),也可以建立新的分支線(branch)來嘗試不同的遊戲路線,最後再決定要走哪條線。
總結
- 版本控制解決了手動備份的混亂,讓你能追蹤變更、回溯歷史、多人協作
- Git 是分散式的版本控制系統,每個開發者都有完整的歷史紀錄
- Git 用快照而非差異來記錄版本,切換版本特別快
- 三個區域:工作目錄(編輯)→ 暫存區(準備)→ 儲存庫(正式紀錄)
下一篇,我們將實際安裝 Git,並學習第一個指令。
進階測驗:情境題與概念應用
1. 【情境題】小明在沒有網路的飛機上,想要查看專案三天前的程式碼版本。如果他使用的是 Git(分散式),而同事使用的是 SVN(集中式),哪一種說法正確?
2. 【情境題】小華修改了 10 個檔案,但她只想把其中 3 個檔案的變更提交到儲存庫。Git 的哪個功能讓她能做到這件事?
3. 【概念辨析】為什麼 Git 使用「快照」而非「差異」來記錄版本,會讓切換版本變得更快?
4. 【錯誤診斷】團隊成員小李說:「我們公司的 SVN 伺服器掛了,但沒關係,我電腦上有完整的版本歷史,可以繼續工作。」這句話哪裡有問題?
5. 【應用題】在 Git 的三個工作區域中,當你執行「提交(commit)」這個動作時,變更是從哪裡移動到哪裡?
6. 【情境題】開發者阿傑想要嘗試一個實驗性功能,但又不想影響目前穩定的程式碼。根據文章提到的版本控制好處,他應該使用什麼功能?