Git的三個工做區和文件的三種狀態

本文首發於公衆號「AntDream」,歡迎微信搜索「AntDream」或掃描文章底部二維碼關注,和我一塊兒天天進步一點點git

Git系列

咱們在使用Git的時候通常有3個工做區的概念:Git 倉庫、工做目錄以及暫存區域。其中工做目錄比較好理解,就是咱們開發時修改文件的那些目錄,Git 倉庫就是咱們項目目錄下面的 .git目錄中的內容,而暫存區域是保存已經被Git標記過,將要提交保存到Git數據庫中的文件的地方數據庫

文件從咱們建立到編輯完提交Git幫咱們記錄,一共要經歷3種狀態:已修改(modified)、 已暫存(staged)已提交(committed)bash

  • 剛剛開始時編輯文件,這個時候文件是處於 已修改(modified) 狀態,文件是在工做目錄微信

  • 修改完文件,咱們執行git add,這個時候文件就變爲 已暫存(staged)狀態,文件信息進入暫存區域,內容被保存到Git數據庫中post

  • 而後咱們執行git commit,文件就變爲已提交(committed)狀態,建立了一個提交記錄保存到了Git 倉庫spa

具體過程能夠參見下圖code

暫存區域cdn

暫存區域是一個文件,保存了下次將提交的文件列表信息,通常在 Git 倉庫目錄中。對應於 index文件 中的內容。 這裏須要特別注意暫存區裏保存的內容,咱們能夠經過 git ls-files --stage 命令來查看下里面的內容對象

git ls-files --stage
//輸出
100644 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 0	text.txt
100644 83baae61804e65cc73a7201a7252750c76066a30 0	bak/test.txt
複製代碼

能夠看到,暫存區裏記錄了文件的內容所對應的數據對象,以及文件的路徑(文件名和文件所在目錄)。實際上,暫存區保存的是一系列指向文件的索引,真正的文件內容都在 .git/objects 目錄下,也就是Git數據庫中。blog

考慮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 文件


歡迎關注個人公衆號查看更多精彩文章!
複製代碼

AntDream
相關文章
相關標籤/搜索