Git本地倉庫內部基本結構

2021-09-10 19:45:39 字數 3664 閱讀 5374

git本地倉庫(本文不涉及遠端倉庫)的內部結構簡單如下圖:

1.objects目錄存放的是實際的檔案,當git add命令執行的時候,檔案已經被存到了objects目錄下。

.git/objects目錄下的物件都有乙個40位的id,前兩位作為目錄名,後38位作為檔名

.git/objects$ ls00  06  0c  12  18  1f  26  2c  32  38  3e  44
這些物件主要是commit物件和tree物件(目錄樹)

2.index是乙個索引檔案。存放的是暫存區的整個目錄樹的資訊,並且為目錄樹中的每個檔案都儲存了時間戳和長度。

當git add 將某個檔案新增到暫存區的時候,index檔案中新增了這個檔案的基本資訊。

當我們修改了工作區的某個檔案(比如用touch config.js修改時間戳資訊),這會導致該檔案的時間戳發生變化,而index裡面存放的仍然是舊的資訊。

此時當我們執行git status命令來檢查版本庫的狀況:

a. git status就會用config.js的時間戳和長度和index檔案裡面儲存的config.js的時間戳和長度進行比較。

b. 如果相同,則認為沒有改變。

c. 如果發現不同。git status會繼續用config.js的檔案現在的內容和舊版本的config.js(儲存在.git/objects中)的內容進行比較。

d. 如果內容沒有改變,就簡單的將最新的config.js的時間戳資訊更新到index檔案中

e. 如果內容改變,則提示內容發生改變。但是並不更新index檔案中的config.js的時間戳資訊。

由於演算法優先比較時間戳和長度,避免了當時間戳相同時的檔案內容的比較,因此效能比較高。

因此,git add命令會做兩件事情:

a.新增檔案到暫存區(.git/objects)

b.新增檔案索引到(.git/index)

3.當git commit被成功執行後,會產生一系列物件表示該commit的結果,都儲存在.git/objects目錄下。主要分成三部分:

a.tree物件表示當前commit時候的暫存區的目錄樹,tree物件的內容來自於.git/index檔案。

b.blob物件

tree物件目錄樹中的檔案總是以blob的物件被儲存。如果tree中有三個檔案,那麼就有對應的三個blob物件,它們都能通過tree物件儲存的這些blob物件的摘要資訊(id,檔名,型別等)找到

c.commit物件

該物件記錄了屬於哪個tree物件,上一次commit的物件id,自己的id,作者等等。

因此,當git commit操作執行的時候,會:

a. 用.git/index檔案儲存的目錄樹建立tree物件,

b. 因此tree物件裡面自然就指向了已經被git add新增到.git/objects中的blob檔案。

c. .git/refs/heads/master檔案儲存了這次commit的id

4.head檔案儲存了當前的branch,比如我的head檔案內容:

也就是說head指向了master分支,如果存在多個分支,head也可指向別的分支。

5. .git/refs 目錄稱為引用目錄

引用就是乙個檔案,裡面包含了乙個commit id。.git/refs儲存了所有的引用。

.git/refs/heads目錄下儲存的是分支引用,比如./git/refs/heads/master檔案就是master分支的引用。

.git/refs/tags目錄儲存了tag引用。

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!

1.objects目錄存放的是實際的檔案,當git add命令執行的時候,檔案已經被存到了objects目錄下。

.git/objects目錄下的物件都有乙個40位的id,前兩位作為目錄名,後38位作為檔名

.git/objects$ ls00  06  0c  12  18  1f  26  2c  32  38  3e  44
這些物件主要是commit物件和tree物件(目錄樹)

2.index是乙個索引檔案。存放的是暫存區的整個目錄樹的資訊,並且為目錄樹中的每個檔案都儲存了時間戳和長度。

當git add 將某個檔案新增到暫存區的時候,index檔案中新增了這個檔案的基本資訊。

當我們修改了工作區的某個檔案(比如用touch config.js修改時間戳資訊),這會導致該檔案的時間戳發生變化,而index裡面存放的仍然是舊的資訊。

此時當我們執行git status命令來檢查版本庫的狀況:

a. git status就會用config.js的時間戳和長度和index檔案裡面儲存的config.js的時間戳和長度進行比較。

b. 如果相同,則認為沒有改變。

c. 如果發現不同。git status會繼續用config.js的檔案現在的內容和舊版本的config.js(儲存在.git/objects中)的內容進行比較。

d. 如果內容沒有改變,就簡單的將最新的config.js的時間戳資訊更新到index檔案中

e. 如果內容改變,則提示內容發生改變。但是並不更新index檔案中的config.js的時間戳資訊。

由於演算法優先比較時間戳和長度,避免了當時間戳相同時的檔案內容的比較,因此效能比較高。

因此,git add命令會做兩件事情:

a.新增檔案到暫存區(.git/objects)

b.新增檔案索引到(.git/index)

3.當git commit被成功執行後,會產生一系列物件表示該commit的結果,都儲存在.git/objects目錄下。主要分成三部分:

a.tree物件表示當前commit時候的暫存區的目錄樹,tree物件的內容來自於.git/index檔案。

b.blob物件

tree物件目錄樹中的檔案總是以blob的物件被儲存。如果tree中有三個檔案,那麼就有對應的三個blob物件,它們都能通過tree物件儲存的這些blob物件的摘要資訊(id,檔名,型別等)找到

c.commit物件

該物件記錄了屬於哪個tree物件,上一次commit的物件id,自己的id,作者等等。

因此,當git commit操作執行的時候,會:

a. 用.git/index檔案儲存的目錄樹建立tree物件,

b. 因此tree物件裡面自然就指向了已經被git add新增到.git/objects中的blob檔案。

c. .git/refs/heads/master檔案儲存了這次commit的id

4.head檔案儲存了當前的branch,比如我的head檔案內容:

也就是說head指向了master分支,如果存在多個分支,head也可指向別的分支。

5. .git/refs 目錄稱為引用目錄

引用就是乙個檔案,裡面包含了乙個commit id。.git/refs儲存了所有的引用。

.git/refs/heads目錄下儲存的是分支引用,比如./git/refs/heads/master檔案就是master分支的引用。

.git/refs/tags目錄儲存了tag引用。

git 本地倉庫

git是當前最流行的版本控制軟體 在本地安裝git 檢查是否安裝git git version 1.建立倉庫 在本地建立乙個資料夾,裡面放上要放在git倉庫中管理的檔案,在命令列提示符中,進入到該資料夾下,執行命令git init 這是把該普通的資料夾初始化成git倉庫,通過輸出可以檢視初始畫的是乙...

git本地倉庫

預設的位置是在你所安裝git的目錄下。git的倉庫你可以建在你電腦的任何目錄下 最好不要包含有中文目錄 通過命令列cd指定到你想要的目錄下,例如 cd g git上面的命令將指定到g盤下git資料夾內。當然git目錄是我事先建好的資料夾,你也可以先指定到g,再在g盤下建立新的目錄,使用命令列mkdi...

git刪除本地倉庫

現在本機上有個本地倉庫 root test01 h2 20151112 cd h2 root test01 h2 git branch develop 執行git init命令 root test01 h2 20151112 git init reinitialized existing git r...