Git 版本控制 › 第 1 章

Git 概論與心智模型

2026-06-11  ·  版本控制 · 分散式 · 快照思維 · 三大區域

本章先建立「為什麼需要 Git」與「Git 怎麼看待你的檔案」的整體圖像。理解這層心智模型後,後續所有指令都只是它的延伸操作。

1.1版本控制要解決什麼問題

沒有版本控制時,我們常用「複製整個資料夾」來保存進度,於是出現這種畫面:

沒有版本控制的混亂命名 一排以日期與「最終版」命名的資料夾,顯示手動備份的混亂 專案 3/01 專案_最終版 3/05 真的最終版 3/06 最終版_改 3/06 ?
哪一個才是現在的版本?改壞了能回到哪?別人改的怎麼合併?

版本控制系統(VCS)就是要有系統地解決這些問題,核心能力有四項:

需求VCS 提供的能力
記錄歷史每次有意義的變更存成一個「版本」,附帶時間、作者、說明
回溯隨時回到任何一個歷史版本,或比較版本之間的差異
分支實驗開一條獨立線路嘗試新點子,不影響主線,失敗就丟掉
多人協作多人各自修改,再有規則地合併,並追蹤每一行是誰改的

1.2集中式 vs 分散式

VCS 分兩大類。早期的 SVN、CVS 是集中式:只有一台中央伺服器保存完整歷史,每個人手上只是「工作副本」。Git 則是分散式:每一次 clone 都會把整個版本庫(含全部歷史)複製到本機。

集中式與分散式版本控制比較 左:集中式,客戶端只有工作副本,歷史集中在伺服器;右:分散式,每個節點都有完整版本庫 集中式(SVN / CVS) 中央伺服器 完整歷史 工作副本 無歷史 工作副本 無歷史 每次操作都需連線伺服器 分散式(Git) 遠端(origin) 完整歷史 本機版本庫 完整歷史 本機版本庫 完整歷史 本機即可提交、查歷史,離線也行
分散式的關鍵:每個 clone 都是完整版本庫,不是單純的工作副本
這也是為什麼用 Git 時,commit(提交到本機)和 push(送到遠端)是兩個分開的動作——提交不需要網路,只有要分享給別人時才需要連線。
延伸問答

既然 clone 把整個版本庫(含全部歷史)都複製下來了,為什麼 clone 之後只看得到主分支?

「整座版本庫都複製下來」和「看得到幾個分支」是兩件事。clone 確實把所有物件(全部歷史)所有分支指標都抓到本機,只是分兩種存放方式:

遠端追蹤分支(refs/remotes/origin/*):origin/mainorigin/dev全部都在
本地分支(refs/heads/*):clone 只自動建立一個(遠端的預設分支,通常是 main)。

所以「只看到 main」是因為 git branch 只列本地分支。其他分支沒有不見,它們以 origin/xxx 的形式都在硬碟裡:

git branch      # 只看到  * main          ← 本地分支
git branch -r   # origin/main, origin/dev …  ← 全都在
git branch -a   # 兩者都列出

要切到別的分支,資料早在本機,只要建一個本地分支去指它即可(離線就能做):

git switch dev                 # 新版 Git 自動對應 origin/dev
git checkout -b dev origin/dev # 舊寫法

為什麼這樣設計:工作目錄一次只能呈現一個 commit 的內容,所以 clone 後只「簽出」一個分支;其餘分支保留為 origin/* 追蹤分支,避免汙染本地命名空間,需要時再認領。

一句話:clone 把整座倉庫搬回家了,只是預設只幫你打開其中一個房間(main);其他房間的門都在,推開即可。

1.3快照思維 vs 差異思維

多數舊式 VCS 用差異(delta)思維:記錄每個檔案相對前一版「改了哪幾行」,要還原某版本就得把一連串差異疊加回去。

Git 用快照(snapshot)思維:每次提交,Git 記錄的是當下所有檔案的完整狀態。沒有變動的檔案,不會重複存,而是用一個指標指向前一版的內容(細節在第 2 章)。

差異儲存與快照儲存的比較 上排為差異式儲存,記錄每版的變更行;下排為快照式,每版記錄完整檔案集 差異式(delta) 基準版 完整檔案 Δ 變更1 +3 −1 行 Δ 變更2 +2 行 還原 = 基準 + 疊加所有差異 快照式(Git) 快照 1 快照 2 快照 3 實心 = 該版新存的內容 虛線 = 沿用前版,以指標指向
Git 把每次提交都當成一張完整快照;未變動的檔案以指標重用,不浪費空間
記住這句話:「Git 存的是快照,不是差異。」 你在 git diff 看到的「差異」,其實是 Git 即時比對兩張快照算出來的結果,而非它儲存的形式。

1.4三大區域總覽

使用 Git 時,你的檔案隨時處在三個區域之一。幾乎所有日常指令,本質都是把檔案在這三個區域之間搬動。先記住這張圖,後面章節都會回到它。

Git 三大區域與資料流 工作目錄、暫存區、版本庫三區,以及 add、commit、checkout 的流向。點擊各區查看說明 工作目錄 Working Directory 你實際編輯 的檔案 ▸ 點我看說明 暫存區 Staging Area / Index 下一次提交 的草稿 ▸ 點我看說明 版本庫 Repository (.git) 永久保存的 快照歷史 ▸ 點我看說明 add commit checkout / restore(取回歷史內容) add 把變更放進草稿 · commit 把草稿封存成一張快照
點擊任一區域展開說明

1.5本章小結

重點一句話記住
VCS 的價值有系統地記錄歷史、回溯、分支實驗、多人協作
分散式每個 clone 都是完整版本庫,可離線提交
快照思維Git 存的是每次提交的完整快照,不是差異
三大區域工作目錄 →(add)→ 暫存區 →(commit)→ 版本庫
下一章我們會打開「版本庫」這個黑盒子,看看一張快照在 .git 裡究竟是用什麼物件、如何儲存的。