【Git 入門教學】#01 什麼是版本控制?為什麼需要 Git?

1. 以下哪一個是「沒有使用版本控制」時常見的問題?

2. Git 屬於哪種類型的版本控制系統?

3. Git 記錄版本的方式是?

4. Git 的「暫存區(Staging Area)」的作用是什麼?

5. Git 專案的版本歷史儲存在哪裡?

你有沒有遇過這種情況:專案資料夾裡躺著 project_final.zipproject_final_v2.zipproject_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

這種「人工版本控制」有幾個致命問題:

  1. 無法追蹤變更indexbackup.htmlindexold.html 差在哪?沒人知道
  2. 無法協作:同事 A 改了 index.html,同事 B 也改了,誰的版本才對?
  3. 無法回溯:「上禮拜那個功能還在的版本在哪?」答案通常是找不到
  4. 佔用空間:每次備份都是完整複製,硬碟很快就滿了

版本控制系統解決什麼問題

版本控制系統(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. 【情境題】開發者阿傑想要嘗試一個實驗性功能,但又不想影響目前穩定的程式碼。根據文章提到的版本控制好處,他應該使用什麼功能?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *