Git暫存區深入理解

admin發表於2018-07-18

關於暫存區的基本概念可以參閱Git工作區和暫存區一章節。

通過git add命令可以將工作區中指定內容加入暫存區,程式碼例項如下:

[Shell] 純文字檢視 複製程式碼
$ git add readme.txt

上述程式碼將工作區中的readme.txt檔案加入到暫存區。

從“暫存區”名字來理解,此區域好像是一個倉庫,把將要提交的內容暫時存放於此。

上述理解從感性上來說沒什麼問題,並且有助於接受此概念。

然而暫存區的實質是什麼呢,僅僅是一個檔案罷了,截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/001723t4dck4mdo1etp1sx.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

所謂的暫存區僅僅是.git目錄下的一個index檔案罷了,這也是為了什麼被稱為index(索引)。

下面先看一下當前專案的狀態,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ git status

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/001828azfl8hll1ol4ojrl.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到readme.txt檔案被修改,位於暫存區待commit提交狀態。

現在看一下暫存區內容,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ git ls-files --stage

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/001913v5r6r08cc9cgcxct.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

下面我們新增一個檔案並將其新增至暫存區,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ echo '螞蟻部落' > antzone.txt

新建一個antzone.txt檔案,並寫入字串"螞蟻部落"。

[Shell] 純文字檢視 複製程式碼
$ git add antzone.txt

將新增的antzone.txt檔案新增至暫存區;再來看.git/index檔案中的內容:

[Shell] 純文字檢視 複製程式碼
$ git ls-files --stage

程式碼執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/002106pfuepemu39d2e5fd.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

由此可見,暫存區叫做index(索引)才是實至名歸,的確是指向檔案的索引。

真正的檔案儲存在.git/objects目錄中,具體參閱Git儲存內容的位置與方式一章節。

下面將暫存區內容提交,並檢視提交後的狀態,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ git commit -m "c5"

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/002148z1tbxtztf3a4tf8t.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

由此可見,工作區沒有新增或者修改的檔案,暫存區也沒有待提交檔案。

再來看index檔案中的內容,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ git ls-files --stage

程式碼執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/002253xyysbsyeynbtyeye.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

暫存區依然如故,並不像是我們感性上認為被清空。

當刪除暫存區內容的時候,其實就是刪除index檔案中的內容,.git/objects目錄中的內容不會被刪除。

刪除命令如下:

[Shell] 純文字檢視 複製程式碼
$ git rm --cached readme.txt

相關文章