本文首發于公衆号“AntDream”,歡迎微信搜尋“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點
我們在使用Git的時候一般有3個工作區的概念:Git 倉庫、工作目錄以及暫存區域。其中工作目錄比較好了解,就是我們開發時修改檔案的那些目錄,Git 倉庫就是我們項目目錄下面的
.git
目錄中的内容,而暫存區域是儲存已經被Git标記過,将要送出儲存到Git資料庫中的檔案的地方
檔案從我們建立到編輯完送出Git幫我們記錄,一共要經曆3種狀态:已修改(modified)、 已暫存(staged)和已送出(committed)
- 剛剛開始時編輯檔案,這個時候檔案是處于 已修改(modified) 狀态,檔案是在工作目錄
- 修改完檔案,我們執行
,這個時候檔案就變為 已暫存(staged)狀态,檔案資訊進入暫存區域,内容被儲存到Git資料庫中git add
- 然後我們執行
,檔案就變為已送出(committed)狀态,建立了一個送出記錄儲存到了Git 倉庫git commit
具體過程可以參見下圖
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL2cjZlhjYlVTZyEWYhVDZzETZjRjZjJTOmNjZ1MGN5MTM2ITY1gDOj9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
暫存區域
暫存區域是一個檔案,儲存了下次将送出的檔案清單資訊,一般在 Git 倉庫目錄中。對應于 index檔案 中的内容。
這裡需要特别注意暫存區裡儲存的内容,我們可以通過
git ls-files --stage
指令來檢視下裡面的内容
git ls-files --stage
//輸出
100644 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 0 text.txt
100644 83baae61804e65cc73a7201a7252750c76066a30 0 bak/test.txt
可以看到,暫存區裡記錄了檔案的内容所對應的資料對象,以及檔案的路徑(檔案名和檔案所在目錄)。實際上,暫存區儲存的是一系列指向檔案的索引,真正的檔案内容都在
.git/objects
目錄下,也就是Git資料庫中。
考慮2種情況:
情況一:如果此時,我們修改
text.txt
檔案,然後重新
add
進暫存區,那暫存區會怎麼變化?
實際上,暫存區還是隻有2條索引,隻不過指向
text.txt
檔案的索引變成了新的(這個時候
.git/objects
目錄下會多出一條記錄,記錄
text.txt
檔案的新版本)
情況二:如果此時,我們删除一條記錄,比如
text.txt
檔案的索引記錄,會有什麼影響?
首先
.git/objects
目錄下對應的那條資料并不會被删除,這也就是開頭說的 你執行的 Git 操作,幾乎隻往 Git 資料庫中增加資料 ,不會删除資料。
暫存區
text.txt
檔案的索引會被删除,
text.txt
檔案就會重新變為待
add
狀态,此時如果我們執行
commit
操作,送出的内容将不會包含
text.txt
檔案
歡迎關注我的微信公衆号,和我一起每天進步一點點!