天天看點

Git的三個工作區和檔案的三種狀态

本文首發于公衆号“AntDream”,歡迎微信搜尋“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點

我們在使用Git的時候一般有3個工作區的概念:Git 倉庫、工作目錄以及暫存區域。其中工作目錄比較好了解,就是我們開發時修改檔案的那些目錄,Git 倉庫就是我們項目目錄下面的

.git

目錄中的内容,而暫存區域是儲存已經被Git标記過,将要送出儲存到Git資料庫中的檔案的地方

檔案從我們建立到編輯完送出Git幫我們記錄,一共要經曆3種狀态:已修改(modified)、 已暫存(staged)和已送出(committed)

  • 剛剛開始時編輯檔案,這個時候檔案是處于 已修改(modified) 狀态,檔案是在工作目錄
  • 修改完檔案,我們執行

    git add

    ,這個時候檔案就變為 已暫存(staged)狀态,檔案資訊進入暫存區域,内容被儲存到Git資料庫中
  • 然後我們執行

    git commit

    ,檔案就變為已送出(committed)狀态,建立了一個送出記錄儲存到了Git 倉庫

具體過程可以參見下圖

Git的三個工作區和檔案的三種狀态

暫存區域

暫存區域是一個檔案,儲存了下次将送出的檔案清單資訊,一般在 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

檔案

歡迎關注我的微信公衆号,和我一起每天進步一點點!

繼續閱讀