暫存區(stage, index)是 git 最重要的概念之一,理解了這個概念很多 git 命令就不再那麼神秘了。 今天在寫這部分的內容,畫了乙個圖,看看有沒有什麼問題。
理解 git 暫存區(stage) 把上面的「實踐二」從頭至尾走一遍,不知道您的感想如何?
在「實踐二」的過程中,我有意無意的透漏了「暫存區」的概念,為了避免使用者被新概念嚇壞,在暫存區出現的地方用同時使用了「提交任務」這一更易理解 的概念,但是暫存區(stage, 或稱為 index)才是其真正的名稱。我認為 git 暫存區(stage, 或稱為 index)的設計是 git 最成功的設計之一,也是最難理解的乙個設計。 在版本庫(.git)目錄下,有乙個 index 檔案,我們針對這個檔案做乙個有趣的試驗。 首先我們執行 "git checkout" 命令撤銷工作區中
welcome.txt 檔案尚未提交的修改。
$ git checkout -- welcome.txt我們通過狀態輸出,看以看到工作區已經沒有改動了。我們檢視一下$ git status -s
.git/index 檔案,注意該檔案的時間戳(19:37:44):
$ ls --full-time .git/index我們再次執行 "git status" 命令,然後顯示-rw-r--r-- 1 jiangxin jiangxin 112 2010-11-29 19:37:44.625246224 +0800 .git/index
.git/index 檔案的時間戳(19:37:44),和上面的一樣。
$ git status -s現在我們更改一下 welcome.txt 的時間戳,但是不改變它的內容。然後再執行 "git status" 命令,然後檢視$ ls --full-time .git/index
-rw-r--r-- 1 jiangxin jiangxin 112 2010-11-29 19:37:44.625246224 +0800 .git/index
.git/index 檔案時間戳(19:42:06)。
$ touch welcome.txt看到了麼,時間戳改變了! 這個試驗說明當執行 "git status" 命令掃瞄工作區改動的時候,先依據$ git status -s
$ ls --full-time .git/index
-rw-r--r-- 1 jiangxin jiangxin 112 2010-11-29 19:42:06.980243216 +0800 .git/index
.git/index 檔案中記錄的(工作區跟蹤檔案的)時間戳、長度等資訊判斷工作區檔案是否改變。如果工作區的檔案時間戳改變,說明檔案的內容可能被改變了,需要要開啟檔案,讀取檔案內容,和更改前的原始檔案相比較,判斷檔案內容是否被更改。如果檔案內容沒有改變,則將該檔案新的時間戳記錄到
.git/index 檔案中。因為判斷檔案是否更改,使用時間戳、檔案長度等資訊進行比較要比通過檔案內容比較要快的多,所以 git 這樣的實現方式可以讓工作區狀態掃瞄更快速的執行,這也是 git 高效的因素之一。
檔案 .git/index 實際上就是乙個包含檔案索引的目錄樹,像是乙個虛擬的工作區。在這個虛擬工作區的目錄樹中,記錄了檔名、檔案的狀態資訊(時間戳、檔案長度等),檔案的 內容並不儲存其中,而是儲存在 git 物件庫(.git/objects)中,檔案索引建立了檔案和物件庫中物件實體之間的對應。下面這個圖展示了工作區、版本庫中的暫存區和版本庫之間的關 系。
工作區、版本庫、暫存區原理圖
在這個圖中,我們可以看到部分 git 命令是如何影響工作區和暫存區(stage, index)的。
Git 工作區 暫存區和版本庫
暫存區 stage,index 是 git 最重要的概念之一,理解了這個概念很多 git 命令就不再那麼神秘了。今天在寫這部分的內容,畫了乙個圖,看看有沒有什麼問題。理解 git 暫存區 stage 把上面的 實踐二 從頭至尾走一遍,不知道您的感想如何?在 實踐二 的過程中,我有意無意的透漏了 暫存...
Git 工作區 暫存區和版本庫
暫存區 stage,index 是 git 最重要的概念之一,理解了這個概念很多 git 命令就不再那麼神秘了。今天在寫這部分的內容,畫了乙個圖,看看有沒有什麼問題。理解 git 暫存區 stage 把上面的 實踐二 從頭至尾走一遍,不知道您的感想如何?在 實踐二 的過程中,我有意無意的透漏了 暫存...
Git 工作區 暫存區和版本庫
暫存區 stage,index 是 git 最重要的概念之一,理解了這個概念很多 git 命令就不再那麼神秘了。我認為 git 暫存區 stage,或稱為 index 的設計是 git 最成功的設計之一,也是最難理解的乙個設計。當執行 git status 命令掃瞄工作區改動的時候,先依據 git ...