天天看點

g-git 相關指令 及其 基本原理探索 (一)

文章目錄

  • ​​git 最小配置作用域​​
  • ​​git 建立本地倉庫​​
  • ​​git log 檢視版本演進​​
  • ​​.git 目錄​​
  • ​​refs目錄​​
  • ​​objects​​
  • ​​git 三種對象類型詳解 (commit ,tree,blob)​​

因為工作需求,接下來将從git的使用到其内部工作原理,來避免代碼送出或者review或者版本管理上的一些尴尬,同時也來學習一下這個優秀的分布式版本管理工具的實作,了解事務在分布式裡面的原子性思想。

git 最小配置作用域

g-git 相關指令 及其 基本原理探索 (一)

git 建立本地倉庫

g-git 相關指令 及其 基本原理探索 (一)

git log 檢視版本演進

g-git 相關指令 及其 基本原理探索 (一)

.git 目錄

g-git 相關指令 及其 基本原理探索 (一)

單獨介紹一下如下兩個重要的目錄:

refs目錄

refs目錄下有兩個目錄:heads和tags

  • heads 儲存的是獨立的分支空間,且之間互不影響。
  • tags表示裡程碑,項目開發到一定程度之後可以打上對應的tags作為一個階段的标記

heads目錄下的 分支内容儲存的是一個個代表唯一分支的名稱的四十位的hash值

g-git 相關指令 及其 基本原理探索 (一)

通過​

​git branch -av​

​看到的分支資訊 看到的分支名稱後面的hash值比較短,這裡是隻要這個hash值能夠唯一代表目前的分支即可顯示,是以短一點也是能夠唯一性表示目前分支的。

g-git 相關指令 及其 基本原理探索 (一)

tags的目錄下也儲存着之前打過的tags,為每一個tags生成一個唯一的對象,且用40位的hash值進行辨別

通過如下兩個指令可以檢視對應hash值代表的對象類型和操作内容

  • ​git cat-file -t hash_value​

    ​ 檢視對象類型
  • ​git cat-file -p hash_value​

    ​ 檢視對象内容

objects

目錄内容如下:

g-git 相關指令 及其 基本原理探索 (一)

pack 是在多個松散目錄較多的情況下對其進行壓縮,将壓縮後的資料儲存到目前目錄

其他松散目錄來看一下

​cd 14 && ls -al​

g-git 相關指令 及其 基本原理探索 (一)

​git cat-file -t 142a4f1706858e07b1a29c591d48ebc3e562bc45​

​ -t來檢視類型 以及-p 檢視具體的内容

這裡需要注意hash數值的前兩位一定是目錄名稱,後面是實際的hash數值

g-git 相關指令 及其 基本原理探索 (一)

類型是tree,且發現内容是一個blob類型的對象,其儲存的是我們目前git目錄下的唯一一個檔案test_file,繼續檢視其類型及内容

g-git 相關指令 及其 基本原理探索 (一)

git 三種對象類型詳解 (commit ,tree,blob)

目前通過對git目錄的通路,可以看到git擁有三種主要的核心對象:commit(heads目錄),tree(objects目錄),blob(實際的資料,儲存在tree對象的指向中)

  • commit類型就是我們使用​

    ​git commit​

    ​送出之後建立的資料對象,使用​

    ​git cat-file -p b360e56​

    ​後面的字元串是本次commit下的内容資訊,它是按照樹形存儲的。主要是裡面的tree類型的檔案夾。

    内容如下:

root@root heads % git cat-file -p b360e56b39a5d605918816ea4dc07d61e93b12f8
tree 142a4f1706858e07b1a29c591d48ebc3e562bc45
parent 30a71408576f421909d05cdd424703b8866dd943
author BaronStack <[email protected]> 1593260841 +0800
committer BaronStack <[email protected]> 1593260841 +0800      
  • tree 類型就是git目錄的管理結構,也可以當作檔案夾來看。通過tree的hash值我們能夠通路到存儲與其檔案夾内部的子目錄以及對應的子檔案。
  • blob類型 是真正存放資料的内容,隻要資料的内容一樣,git這裡隻會建立一個blob對象。是以,這裡也保證了blob的版本控制和不同版本的合并功能是正常的。