Git 工作區 暫存區 版本庫

2021-08-02 10:51:23 字數 1810 閱讀 3165

工作區:我們會想當然的認為,當前倉庫所在目錄就是我們的工作區,其實這是不完全正確的。在當前倉庫中,新增,更改,刪除檔案這些動作,都發生在工作區裡面。

暫存區:英文叫stage, 或index。在版本庫.git)目錄下,有乙個index檔案。它實際上就是乙個包含檔案索引的目錄樹,像是乙個虛擬的工作區。在這個虛擬工作區的目錄樹中,記錄了檔名、檔案的狀態資訊(時間戳、檔案長度等),檔案的內容並不儲存其中,而是儲存在git物件庫(.git/objects)中,檔案索引建立了檔案和物件庫中物件實體之間的對應。如果當前倉庫,有檔案更新,並且使用git add 命令,那麼這些更新就會出現在暫存區中。

版本庫:當前倉庫下,如果沒有任何的提交,那麼版本庫就是對應上次提交後的內容。下面這個圖展示了工作區、版本庫中的暫存區和版本庫之間的關係。

圖中左側為工作區,右側為版本庫。在版本庫中標記為 "index" 的區域是暫存區(stage, index),標記為 "master" 的是 master 分支所代表的目錄樹。

圖中我們可以看出此時 "head" 實際是指向 master 分支的乙個「游標」。所以圖示的命令中出現 head 的地方可以用 master 來替換。

圖中的 objects 標識的區域為 git 的物件庫,實際位於 ".git/objects" 目錄下,裡面包含了建立的各種物件及內容。

當對工作區修改(或新增)的檔案執行 "git add" 命令時,暫存區的目錄樹被更新,同時工作區修改(或新增)的檔案內容被寫入到物件庫中的乙個新的物件中,而該物件的id被記錄在暫存區的檔案索引中。

當執行提交操作(git commit)時,暫存區的目錄樹寫到版本庫(物件庫)中,master 分支會做相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。

當執行 "git reset head" 命令時,暫存區的目錄樹會被重寫,被 master 分支指向的目錄樹所替換,但是工作區不受影響。

當執行 "git rm --cached " 命令時,會直接從暫存區刪除檔案,工作區則不做出改變。

當執行 "git checkout ." 或者 "git checkout -- " 命令時,會用暫存區全部或指定的檔案替換工作區的檔案。這個操作很危險,會清除工作區中未新增到暫存區的改動。

當執行 "git checkout head ." 或者 "git checkout head " 命令時,會用 head 指向的 master 分支中的全部或者部分檔案替換暫存區和以及工作區中的檔案。這個命令也是極具危險性的,因為不但會清除工作區中未提交的改動,也會清除暫存區中未提交的改動。

使用git diff檢視各個區之間的差異

git diff 和 git diff --cached容易混淆

git diff 比較的是工作區和暫存區的差別

git diff --cached 比較的是暫存區和版本庫的差別

git diff head 可以檢視工作區和版本庫的差別

每次commit後,git diff --cached沒有內容,是因為暫存區的內容已經更新到版本庫中,因此暫存區和版本庫中的內容無差別

git reset和git revert的區別

reset是重置,預設是git reset --mixed 可以讓版本庫重置到某個commit狀態,該commit之後的commit不會保留,並重置暫存區,但是不改變工作區。即這個時候,上次提交的內容在工作區中還會存在。

如果使用git reset --hard 將版本庫,暫存區和工作區的內容全部重置為某個commit的狀態。之前的commit不會保留。

revert比reset更加溫柔一點,回滾到某次commit且該commit之後的提交記錄都會保留,並且會在此基礎上新建乙個提交。對於已經push到伺服器上的內容作回滾,推薦使用revert。

Git 工作區 版本庫 暫存區

tags git 參考部落格 工作區 電腦裡能看到的目錄,就是我們建立的 learngit 資料夾。版本庫 工作區里有乙個隱藏的 git 目錄,這個就是 git 的版本庫。git 的版本庫里存了很多東西,其中最重要的就是稱為 stage 的暫存區,還有 git 為我們自動建立的第乙個分支 maste...

git 工作區 暫存區 版本庫

工作區 working directory 就是你在電腦裡能看到的目錄 版本庫 repository 工作區有乙個隱藏目錄.git,這個不算工作區,而是git的版本庫。暫存區 git的版本庫里存了很多東西,其中最重要的就是稱為stage 或者叫index 的暫存區,還有git為我們自動建立的第乙個分...

Git 工作區 暫存區和版本庫

暫存區 stage,index 是 git 最重要的概念之一,理解了這個概念很多 git 命令就不再那麼神秘了。今天在寫這部分的內容,畫了乙個圖,看看有沒有什麼問題。理解 git 暫存區 stage 把上面的 實踐二 從頭至尾走一遍,不知道您的感想如何?在 實踐二 的過程中,我有意無意的透漏了 暫存...