Git的使用---5. 工做區、暫存區和倉庫

1. Git的提交流程

工做區 -- add -- > 暫存區 -- commit -- > 版本庫
工做區

工做區就是你在電腦裏能看到的目錄,好比你的項目目錄。git

版本庫

工做區下面有一個隱藏目錄.git目錄,這個.git目錄不算工做區,它是Git的版本庫,它存儲變化日誌及版本信息。學習

前面咱們講Git的基本使用的時候,咱們提到了一個暫存區(stage, 或稱爲 index)的概念,當時怕你們被新概念嚇怕,因此沒有細細的講,其實暫存區是Git最成功的設計之一,也是最難理解的部分,下面咱們經過一個例子好好的分析學習一下暫存區。設計

當執行 "git status" 命令掃描工做區改動的時候,先依據.git/index文件中記錄的已跟蹤的文件的時間戳、長度等信息判斷工做區文件是否改變。若是工做區的文件時間戳改變,說明文件的內容可能被改變了,這個時候就須要打開文件,讀取文件內容,和更改前的記錄的原始文件相比較,判斷文件內容是否被更改。若是文件內容有改變,則將該文件新的時間戳記錄到.git/index文件中。所以.git/index的時間戳也跟着變化了。爲何要這樣作?由於判斷文件是否更改,使用時間戳、文件長度等信息進行比較要比直接經過文件內容比較要快的多,因此Git這樣的實現方式可讓工做區狀態掃描速度更快。3d

下圖展現了工做區、版本庫中的暫存區和版本庫之間的關係。指針

image

對上圖的說明:日誌

.git/index實際上就是一個包含文件索引的目錄樹,像是一個虛擬的工做區。在這個虛擬工做區的目錄樹中,記錄了文件名、文件的狀態信息(時間戳、文件長度等),文件的內容並不存儲其中,而是保存在Git對象庫(.git/objects)中,他們經過這個索引和對象實體是對應着的。從上面的圖咱們能夠看出:對象

  1. 圖中左側爲工做區,右側爲版本庫。在版本庫中標記爲 "index" 的區域是暫存區(stage, index),標記爲 "master" 的是 master 分支所表明的目錄樹。
  2. 圖中咱們能夠看出此時"HEAD"實際是指向master分支的一個「遊標」。因此圖示的命令中出現HEAD的地方能夠用master來替換。
  3. 圖中的 objects 標識的區域爲Git的對象庫,實際位於 ".git/objects" 目錄下
  4. 當對工做區修改(或新增)的文件執行"git add"命令時,暫存區的目錄樹被更新。同時工做區修改(或新增)的文件內容被寫入到對象庫中的一個新的對象中,而該對象的id被記錄在暫存區的文件索引中
  5. 當執行提交操做(git commit)時,暫存區的目錄樹寫到版本庫(對象庫)中,master 分支會作相應的更新。即 master 指向的目錄樹就是提交時暫存區的目錄樹。
下面咱們在過一遍流程:

【總體】Git的版本庫裏存了不少東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。blog

image

add後:索引

image

再執行git commit就能夠一次性把暫存區的全部修改提交到分支it

一旦提交後,若是你又沒有對工做區作任何修改,那麼工做區就是「乾淨」的。

如今版本庫變成了這樣:

image

相關文章
相關標籤/搜索