git的三個區域與.git目錄解析【圖文經典版】

git三個區域與文件的三種狀態

一、git的三個區域

一、Git 的工做目錄git

二、暫存區域web

三、以及本地倉庫shell

二、文件的三種狀態

對於任何一個文件,在 Git 內都只有三種狀態:數據庫

一、已修改(modified)    --> Git 的工做目錄安全

二、已暫存(staged)        -->暫存區域spa

三、已提交(committed) -->本地倉庫指針

已修改表示修改了某個文件,但尚未提交保存;對象

已暫存表示把已修改的文件放在下次提交時要保存的清單中。ip

已提交表示該文件已經被安全地保存在本地數據庫中了;rem

由此咱們看到 Git 管理項目時,文件流轉的三個工做區域:Git 的工做目錄,暫存區域,以及本地倉庫。

 

 

.git文件夾目錄結構

1 、hooks文件夾:

    這個目錄存放一些shell腳本,能夠設置特定的git命令後觸發相應的腳本;

    在搭建gitweb系統或其餘git託管系統會常常用到hook script。

二、info文件夾:

     包含git倉庫的一些信息

3 、logs文件夾:

     保存全部更改的引用記錄,繼續打開logs文件夾,有refs文件夾和HEAD文件

    請看下圖中

(1)HEAD文件

        主要記錄每次的變動操做,全部類型的變動都會記錄的哦,

         git reflog命令查詢出的列表就是HEAD中存儲的列表

(2)繼續打開refs文件夾,能夠看到heads文件夾、remotes文件夾和stash文件

    I : stash文件存儲的是全部你使用git stash命令暫存的記錄,是一個列表。使用git stash list時,查詢出的列表就是從stash中取出來的。

    II:heads文件裏面存儲的是一系列的本地分支的對象,每一個對象的文件名就是本地的一個分支名,使用git branch查看本地分支命令時,查詢出的全部本地分支就是取的heads文件夾下全部文件的名稱。

    III:remotes文件夾裏存儲的是遠端的一系列分支的對象,每一個對象的文件名稱就是遠端的一個分支名稱,使用git branch -a查看遠端分支命令時,查詢出的全部本地分支就是取的remotes文件夾下全部文件的名稱。

四、objects文件夾

該目錄存放全部的Git對象,對象的SHA1哈希值(一共40位)的前兩位是文件夾名稱,後38位做爲存在相應文件夾下對象的文件名。

好比0b這個文件夾,它裏面有一系列git對象(也就是文件),裏面全部文件的38位的名稱加上0b,就組成原來的40位的哈希值了。

更近一步說,咱們每次提交新文件到git上時,這時會根據該文件內容計算生成一個40位的哈希值,假如生成的是0c7bcc3f8f1c5311d06e3067f7f7dddecb8668fe,這個文件的存儲方式就是先截取0c做爲文件夾名稱,而後後面的38位7bcc3f8f1c5311d06e3067f7f7dddecb8668fe做爲文件名稱,存儲在0c文件夾下。

若是這時你又提交了一個文件或者修改了一個文件碰巧又生成一個以0c開通的哈希值,那麼這個時候就會直接截取該哈希值的後38位做爲該次生成的git對象的文件名,存儲在原來已經存在的0c文件夾下。

五、refs文件夾

(1)heads文件夾

        該文件夾存儲的是全部的本地分支文件,每個本地分支文件中,存儲的是一個哈希值,每一次commit都是生成一個對應的哈希值,而後用此次新生成的哈希值,替換掉原來這個分支文件中的哈希值。

以下三張圖,紅色的表明新提交的三個文件,而後

    

(2)stash文件

        該文件夾是使用git stash命令時,會將生成的git對象的哈希值存儲到stash文件裏,更進一步說stash文件中,就存了一個40位的哈希值。對應的git對象在objects文件夾裏。使用git stash pop時,會先去stash文件中,找到該哈希值(或者也能夠認爲是指針),而後到對應的objects文件夾下,查找對應的git對象,將其中的數據取出來,轉換成咱們能看懂的代碼

        I、繼續打開tags文件夾

            當使用git tag v1.0給當前分支,打上標籤時,就會在tags文件夾下,生成對應文件,文件裏存儲的是當前分支所對應的哈希值,之後就可使用v1.0這個標籤來代替分支名稱,一般發佈穩定的線上版本時,使用這種作法。方便之後查詢,由於使用標籤容易記,更簡潔。

六、COMMIT_EDITMSG文件提交的是最近一次提交的描述信息

七、 config:這個是GIt倉庫的配置文件

八、 description:倉庫的描述信息,主要給gitweb等git託管系統使用

九、 index:這個文件就是咱們前面提到的暫存區(stage),是一個二進制文件

十、HEAD文件裏面只存儲了當前分支的關聯

 

 

參考:

https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80

https://www.jianshu.com/p/25293009f738

相關文章
相關標籤/搜索