可以將git簡單的分為三個區域
1、工作區(working directry)
2、暫緩區(stage index)
3、歷史記錄區(history)
如圖:[img]
git add files 把當前工作目錄中的檔案放入暫存區域
其實做了兩件事:
1、將本地檔案的時間戳、長度,當前文件物件的id等資訊儲存到乙個樹形目錄中去(index,即平時說的暫存區)
2、將本地檔案的內容做快照並儲存到git 的物件庫
(綜上:實際上就是乙個包含檔案索引的目錄樹,像是乙個虛擬的工作區。在這個虛擬工作區的目錄樹中,記錄了檔名、檔案的狀態資訊(時間戳、檔案長度等),檔案的 內容並不儲存其中,而是儲存在 git 物件庫(.git/objects)中,檔案索引建立了檔案和物件庫中物件實體之間的對應。)
如圖:[img]
在這個圖中,我們可以看到部分 git 命令是如何影響工作區和暫存區(stage, index)的:
圖中左側為工作區,右側為版本庫。在版本庫中標記為 "index" 的區域是暫存區(stage, index),標記為 "master" 的是 master 分支所代表的目錄樹。
圖中我們可以看出此時 "head" 實際是指向 master 分支的乙個「游標」。所以圖示的命令中出現 head 的地方可以用 master 來替換。
圖中的 objects 標識的區域為 git 的物件庫,實際位於 ".git/objects" 目錄下
當對工作區修改(或新增)的檔案執行 "git add" 命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的檔案內容被寫入到物件庫中的乙個新的物件中,而該物件的id 被記錄在暫存區的檔案索引中
當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(物件庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹
git reset -- files 用來撤銷最後一次git add files(因為每git add file一次,暫存區的檔案都會被更改一次),你也可以用git reset 撤銷所有暫存區域檔案。
git checkout -- files 把檔案從暫存區域複製到工作目錄,用來丟棄本地修改。
當執行 "git rm --cached " 命令時,會直接從暫存區刪除檔案,工作區則不做出改變
當執行 "git checkout ." 或者 "git checkout -- " 命令時,會用暫存區全部或指定的檔案替換工作區的檔案。這個操作很危險,會清除工作區中未新增到暫存區的改動
當執行 "git checkout head ." 或者 "git checkout head " 命令時,會用 head 指向的 master 分支中的全部或者部分檔案替換暫存區和以及工作區中的檔案。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改 動
當執行 "git status" 命令掃瞄工作區改動的時候,先依據 .git/index 檔案中記錄的(工作區跟蹤檔案的)時間戳、長度等資訊判斷工作區檔案是否改變。如果工作區的檔案時間戳改變,說明檔案的內容 可能 被改變了,需要要開啟檔案,讀取檔案內容,和更改前的原始檔案相比較(本地檔案和與之對應的object庫中的檔案的內容進行對比),判斷檔案內容是否被更改。如果檔案內容沒有改變,則將該檔案新的時間戳記錄到 .git/index 檔案中。因為判斷檔案是否更改,使用時間戳、檔案長度等資訊進行比較要比通過檔案內容比較要快的多,所以 git 這樣的實現方式可以讓工作區狀態掃瞄更快速的執行,這也是 git 高效的因素之一。
git diff files 來進行具體檔案的變動對比,通常用來進行work directory 與 stage之間的對比,實質上是用 git objects 庫中的快照與work directory 檔案的內容的對比
git 三 理解工作區與暫存區的區別
基本概念 工作區 就是你在電腦上看到的目錄,比如目錄下testgit裡的檔案 git隱藏目錄版本庫除外 或者以後需要再新建的目錄檔案等等都屬於工作區範疇。版本庫 repository 工作區有乙個隱藏目錄.git,這個不屬於工作區,這是版本庫。其中版本庫裡面存了很多東西,其中最重要的就是stage ...
git 三 理解工作區與暫存區的區別
基本概念 工作區 就是你在電腦上看到的目錄,比如目錄下testgit裡的檔案 git隱藏目錄版本庫除外 或者以後需要再新建的目錄檔案等等都屬於工作區範疇。版本庫 repository 工作區有乙個隱藏目錄.git,這個不屬於工作區,這是版本庫。其中版本庫裡面存了很多東西,其中最重要的就是stage ...
git學習 四 理解git暫存區 stage
與一般的版本管理不同的是,git在提交之前要將更改通過git add 新增到暫存區才能提交 git commit 即使是已經交給了git來管理的檔案也是如此。這裡繼續學習git的暫存區。在版本庫.git目錄下有乙個index檔案。首先執行git checkout命令,撤銷工作區中welcome.tx...