當前位置:編程學習大全網 - 源碼下載 - Git系列的底層故事

Git系列的底層故事

本章是Git的核心知識點,主要介紹Git的底層原理和使用Git過程中的幾個重要領域,了解Git的整個使用過程和數據存儲過程。

工作目錄:

工作區是我們通常寫文本文件的地方。

階段/索引:

臨時存儲區域是我們將文本文件提交到本地倉庫的來源。只有當工作區中的文件被添加到臨時存儲區時,它們才能被提交到本地倉庫。

本地存儲庫(Repository):

本地倉庫保留了每次文件更新的記錄,包括提交者、提交時間、提交內容等詳細信息,方便追溯版本歷史。

遠程存儲庫(遠程存儲庫):

遠程倉庫是本地倉庫的副本,主要是為了方便合作夥伴之間倉庫文件的同步。

因此,其使用過程可以簡單概括為:

1.構建壹個本地目錄來創建壹個git倉庫。

$ git init gitDirectory

2.在倉庫目錄下創建壹個文本文件(工作區)。

$ cd gitDirectory

$ echo " first txt " & gtfirst.txt

3.將工作區的first.txt文件添加到git臨時存儲區。

$ git add first.txt

4.將暫存區的文件first.txt提交到本地倉庫。

$ git commit -m“第壹次提交”

5.將文件保存到本地倉庫可以記錄我們每次提交的歷史信息,但是為了方便其他合作夥伴的合作,我們需要構建壹個遠程服務。(這次以GitHub為例)

在GitHub中創建壹個本地同名的倉庫,創建成功後會生成壹個倉庫地址:

/mr-kings/gitDirectory.git

6.將本地倉庫與遠程倉庫相關聯。

$ git remote add origin/Mr-kings/git directory . git

7.第壹次提交本地倉庫到遠程倉庫。

$ git push -u原始主機

第壹次需要添加-u參數,即本地主分支對應遠程倉庫的主分支。

8.此時本地倉庫和遠程倉庫已經同步,其他合作夥伴只需要到遠程倉庫將倉庫克隆到自己的電腦上進行協同編輯即可。

$ git clone/Mr-kings/git directory . git

9.克隆完成後,將在本地生成本地倉庫和工作區,後續操作與第2步及以後的操作相同。

需要註意的是,遠程倉庫有兩種連接方式,mit。

描述:為倉庫創建壹個描述文件。

HEAD (file):指示當前檢出的分支。如果當前在測試分支中,文件內容是ref: refs/heads/test。

Hooks/ (folder):包含客戶端或服務器的hook腳本,比如預提交、後接收等。

Info/ (folder):用於存儲關於git存儲庫的壹些信息,比如exclude。

Objects/ (folder):用於存儲git倉庫中的所有數據內容。

Refs/ (folder):包含heads文件夾和remote文件夾。Heads記錄本地相關的git分支操作記錄,remote記錄遠程倉庫相關的git分支操作記錄。

首次提交時,還會生成以下文件和文件夾:

index(file)-(git添加文件時生成):是當前版本的文件索引,包含生成當前樹的(唯壹確定的)對象的虛擬信息,可以用來快速比較工作樹和其他提交樹對象的差異(每次提交和HEAD之間的diff),可以用來存儲單個文件的多個版本,有效解決合並沖突。您可以使用git ls-files來查看索引文件的內容。

COMMIT _ EDITMSG(file)-(git COMMIT-m“第壹次提交”時生成):最新的提交編輯消息。

logs/(folder)-(git commit-m“first commit”時生成):存放git倉庫操作記錄的文件夾,包括頭文件和refs文件夾。

以上簡單介紹了中的文件和文件夾。git目錄,重點是objects文件夾:

第壹次提交後,objects文件夾下又多了三個文件夾:44/、d0/和f6/。通過提交的日誌,我們發現提交後會生成壹個40位16的十六進制字符串(前兩位是文件夾名,後38位是內容哈希值)。

官方描述:這是阿沙-1哈希值——對要存儲的數據進行SHA-1校驗操作得到的校驗和加上壹個頭(前兩位是文件夾名——後38位是內容的哈希值)。

通過cat-file -t sha-1命令檢查當前哈希值的類型:

從圖中可以看出,它是壹個提交對象。

然後使用命令cat-file -p sha-1查看提交對象包含哪些信息。

由圖可知,提交對象包含樹對象、本地倉庫信息、提交人信息和提交時的備註信息。

然後使用上面的命令查看樹對象包含的信息:

從圖中可知,樹對象還包含blob對象,在多目錄的情況下,樹對象還會包含其他樹對象。

得出剛才提交時生成的三個文件夾對應三個對象,即44/ folder對應提交對象,f6/ folder對應樹對象,d0/ folder對應blob對象。層次關系是提交對象對應於樹對象,樹對象可以包含壹個或多個其他樹對象和blob對象。

git中有幾個對象:

blob:

Blob對象只與文本文件的內容有關,與文本文件的名稱和目錄無關。只要它們是相同的文本文件,它們就會指向相同的blob。

樹:

tree對象記錄了文本文件的內容、名稱、目錄等信息,每次提交都會生成壹個頂級的tree對象,可以指向它所引用的樹或blob。

提交:

commit對象記錄了這次提交的所有信息,包括提交者、提交時間以及這次提交中包含的樹和blob。

標簽:

標簽引用,它指向壹個提交。

今天的內容可以用下圖來概括:上半部分描述git的操作流程圖,下半部分描述git的底層數據存儲結構圖。

Git流程和底層結構圖

以下是對該圖下部的詳細描述:

1.在與相同級別的目錄中創建新的文件夾目錄。git,然後在directory目錄下新建壹個文本文件first.txt,內容為1。執行$ git add first.txt時,會在中生成壹個blob對象的文件夾(前兩位是文件夾名——後38位是文本內容的哈希值)。git/objects/,對應上圖第壹個d00491 - blob對象。

2.執行$ git commit-m“first commit”時,會在下生成兩個樹對象和壹個提交對象文件夾(前兩位是文件夾名——後38位是文本內容的哈希值)。git/objects/,對應上圖中的f6589b - tree對象,4a2e3e - tree對象,6B18。生成兩個樹對象是因為目錄directory是壹個樹對象,並且有與提交對象壹壹對應的頂級樹對象。此時,頭部光標指向當前主分支的第壹次提交。而且這次提交的時候,貼了壹個v1.0版本的標簽。

3.在與相同的目錄中創建壹個新的文本文件second.txt。git,內容為2。執行$ git add second.txt時,會在中生成壹個blob對象的新文件夾(前兩位是文件夾名——後38位是文本內容的哈希值)。git/objects/,對應上面顯示的0 cfbf0-blob對象。

4.執行$ git commit -m“第二次提交”時,會在下生成1個樹對象和壹個提交對象文件夾(前兩位是文件夾名——後38位是文本內容的哈希值)。git/objects/,對應上圖中的35e40c - tree對象和d6dca9 - commit對象。僅生成壹個對應於提交對象的頂層樹對象。由於此次提交的directory目錄中first.txt的內容沒有變化,所以上圖中的35e40c - tree對象也會指向f6589b - tree對象。此時頭部光標指向當前主分支的第二次提交,第二次提交指向最後壹次提交,即父級指向第壹次提交。

後續操作等等,但需要註意的是:

1,blob對象只與文件內容有關,與文件名無關。如果文件名不同,內容相同,那麽只會有壹個blob對象,生成的新樹對象會指向這個blob對象。比如上圖中third.txt和four.txt的內容都是3。因此不會生成新的blob對象,新的樹對象將只指向同壹個blob。

2.如果每個提交中包含的壹些文件沒有被更改(更新),它們將直接指向其原始索引,並且不會重新生成。比如上圖中的directory/first.txt,second.txt。

3.每個提交對象將與頂層樹對象壹壹對應。

  • 上一篇:任務共享應用程序源代碼
  • 下一篇:Illustrator設計展板——畢業設計展板如何做psd
  • copyright 2024編程學習大全網