在上一篇文章中,我們學會了版本控制並建立了第一個版本節點,也提到了 Git 處理檔案的三個區域,但是對於其中細節並沒有特別解釋。這篇文章將會探索 commit 與三個區域到底是什麼,以及檔案在這三個區域中的狀態,還有這些狀態代表著什麼。
如果你還不知道 Git 是什麼,歡迎先去看看我的第一篇 Git 系列文章:
Git 入門:版本控制與 Git 是什麼?【用 Git 打造你的程式時光機 & 平行宇宙】
Git 的三個區域
前一篇文章我們稍微提到了這個概念,今天我們就來深入探究一下這三個區域是什麼。
在 Git 中,資料處理是基於三個區域:工作目錄、暫存區、儲存庫。
工作目錄 Working Directory
這是我們實際看到、編輯檔案的地方。當你開啟檔案資料夾、用編譯器編輯程式碼、新增刪除檔案,這些行為都發生在工作目錄。
📌 重點:Git 會看見「已追蹤」檔案的變化,但不會自動幫你儲存進版本歷史。
暫存區 Staging area/ Index
暫存區有時也會被稱作索引。可以把暫存區想像成是一個「準備清單」。使用 git add 告訴 Git 「我想把這個變更後的檔案存到歷史紀錄」,資料就會被放到這個區域,等待被存成一個歷史節點。
📌 重點:如同這個區域的名字,檔案被添加到這個區域,還沒有正式存成歷史紀錄。
儲存庫 Repository:
儲存庫是真正存放「版本歷史」的地方。執行 git commit -m"變更訊息" 後,暫存區的內容就會被存成一張「快照 snapshot」,未來透過這個紀錄,我們可以將檔案回復到這個時期的樣子。
📌 重點:儲存庫保存的是「暫存區」內容,如果你變更了檔案卻沒有用 git add 保存,git commit 就無法幫你記錄這個變更的版本唷!Git 中的檔案狀態
其實 Git 不只在意檔案存在的「區域」,也會追蹤檔案的狀態。文章前面有提到,Git 會注意到「已追蹤」檔案的變化,那麼已追蹤是什麼意思? 在 Git 的世界,檔案分成未追蹤與已追蹤:
- 未追蹤 Untracked: 新建立、從未經過 git add 的檔案。
- 已追蹤 Tracked: 已經被 Git 納入版本控制,也就是 git add 過的檔案。已追蹤的檔案又可以分為已修改 Modified 或已刪除 Deleted。
在 git status 指令中,除了可以看到檔案的狀態外,也常常會出現三種狀態訊息:
- Changes to be committed
- Nothing to commit, working tree clean
- Changes not staged for commit
下面的範例會一起說明檔案狀態與狀態訊息~
檔案狀態 - Untracked
當資料夾執行 git init 後,資料夾內未被加入版控的檔案都會是「未追蹤」狀態。可以透過 git add file 開始追蹤,只要經過 git add,之後這個檔案的變更都可以被 git 發現~
當資料夾 git init 初始化過後,用 git status 就可以查看狀態,從下圖可以看到,此時資料夾內的檔案會歸類在 Untracked files,並用紅色字標記:

Untracked files
狀態訊息 - Changes to be committed
透過 git add file 追蹤並將檔案加到暫存區,這時 git 已經可以開始追蹤檔案的變更了。可以看到此時檔案會被歸類在 Changes to be committed,並用綠色字標記 new file:

Changes to be committed
狀態訊息 - Nothing to commit, working tree clean
當我們使用 git commit -m"訊息" 將暫存區內容保存為歷史紀錄後,檔案的狀態會顯示 nothing to commit, working tree clean,這代表工作目錄、暫存區的內容與最新一次 commit 的內容一樣,沒有變更:

狀態訊息 - Changes not staged for commit 與檔案狀態 - Modified
現在我們隨便編輯一下檔案,因為 git 已經追蹤了這個檔案,所以它可以知道你的檔案都經歷了些什麼。重新用 git status 查看狀態,Git 會告訴你「Changes not staged for commit」,並且檔案變成紅字標記的 modified,意思是有一個變更的檔案,但是這個變更尚未存到暫存區。

接著再 git add 檔案一次,檔案又會回到 changes to be committed 的狀態:

將暫存區內容保存到儲存庫:

狀態訊息 - Changes not staged for commit 與檔案狀態 - Deleted
如果這時,我刪掉了檔案呢? 刪掉檔案後再一次 git status,可以看到 git 一樣會顯示 changes not staged for commit,並且下方的紅字會顯示 deleted:

同樣用 git add 將這個檔案的變化存到暫存區,重新查看狀態,變成了 changes to be committed:

git commit 將變更保存為歷史節點:

Git 為什麼要分成三個區域
所以 Git 為何要分成三個區域管理檔案? 這是為了讓版本控制的內容更精細可控。如果工作目錄直接對應到儲存庫、每一個小變動都自動存成一個版本,可能會導致一大堆未完成、充滿 bug 的程式都被記錄下來。因此,我會把 Git 分成三個區域的好處歸納為以下幾點:
- 精準過濾:開發過程中可能會產生一大堆臨時檔案或測試變更,這些東西未必需要被存起來,在版本控制時可以精準挑出要存的檔案加入暫存區,即使加錯了也可以再移出。
- 原子提交:你可能同時改了 A、B、C 三個功能,透過暫存區,可以輪流 git add、commit,並且為不同的功能寫它們對應的 commit 訊息,避免一大包混雜的變更。
- 安全試錯:開發時你可能會想嘗試各種亂七八糟的東西、改壞程式碼等,只要這些動作停在工作目錄或暫存區,就不會汙染歷史,可以放心大膽的事!!
總結
到這裡我們已經把 Git 處理檔案的三個核心區域走過好幾遍了,讓我們快速回顧一下重點:
- 在工作目錄的檔案分成:
- 未追蹤,需要透過 git add 加入
- 已追蹤:曾經歷過 git add 的檔案,又分為 modified 與 deleted。
- Git 中,變更後的檔案要利用 git add 添加到暫存區, git commit 也只會對暫存區的內容作用。
- Git 三個操作區域讓版本控制更安全、精準、細緻。
下一篇文章,我們將進入分支的世界!!









