起底Git Git內(nèi)部原理

2018-06-15 20:08 更新

這是起底Git系列的第三篇,本篇我們來介紹一下Git的內(nèi)部工作原理。

What is Git?

你可能聽說過Git是版本控制系統(tǒng)、微型文件系統(tǒng)、內(nèi)容尋址系統(tǒng)。Git的底層是一個微型內(nèi)容尋址系統(tǒng)Git在1.5版本是一個分水嶺,1.5之前更偏向文件系統(tǒng),1.5版本后更偏向版本控制系統(tǒng)

Git常用命令共有30多個,可運行git help查看;但Git總共有130多個命令,可以通過git help -a查看,這些命令可以分為高層命令和底層命令,底層命令被設(shè)計成unix風(fēng)格,不常用

Git倉庫下有一個.git目錄,里面存儲了git全部的秘密,一般包括下面的內(nèi)容:

  • config
  • index
  • HEAD
  • hooks/
  • logs/
  • refs/
  • objects/

下面會詳細(xì)介紹沒個部分都是什么

config

config是倉庫的配置文件,一個典型的配置文件如下,我們創(chuàng)建的遠(yuǎn)端,分支都在配置文件里有表現(xiàn); fetch操作的行為也是在這里配置的

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
[remote "origin"]
    url = git@github.com:yanhaijing/zepto.fullpage.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "dev"]
    remote = origin
    merge = refs/heads/dev

objects

git通過一種算法可以得到任意文件的指紋(40位16進制數(shù)字),然后通過文件指紋存取數(shù)據(jù),存取的數(shù)據(jù)都位于objects目錄

objects目錄下有3種類型的數(shù)據(jù):

  • Blob
  • Tree
  • Commit

文件都被存儲為blob類型的文件,可以通過內(nèi)部命令hash-object寫入數(shù)據(jù)

echo 'test content' | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4

然后通過cat-file取出數(shù)據(jù)

$ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4
test content

文件夾被存儲為tree類型的文件,文件內(nèi)容如下所示

git cat-file -p 99f1a6d12cb4b6f19c8655fca46c3ecf317074e0
100644 blob 47c6340d6459e05787f644c2447d2595f5d3a54b      simplegit.rb

一般我們系統(tǒng)中的目錄,在git中會像下面這樣存儲

創(chuàng)建的提交節(jié)點被存儲為commit類型數(shù)據(jù),commit文件的內(nèi)容如下

$ git cat-file -p fdf4fc3
tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579
author Scott Chacon <schacon@gmail.com> 1243040974 -0700
committer Scott Chacon <schacon@gmail.com> 1243040974 -0700

first commit

有三個提交的Git倉庫可簡化為下圖所示

refs

refs目錄存儲都是引用文件,如本地分支,遠(yuǎn)端分支,標(biāo)簽等

  • refs/heads/xxx 本地分支
  • refs/remotes/origin/xxx 遠(yuǎn)端分支
  • refs/tags/xxx 本地tag

引用文件的內(nèi)容都是40位commit

上面只有提交的圖補上分支后,如下所示

HEAD

HEAD文件存儲的是當(dāng)前所在的位置,其內(nèi)容可以使分支名字,40位commit ID

$ cat HEAD
refs/heads/master

上面的圖補上HEAD后,如下所示:

總結(jié)

如果你有任何疑問的話,歡迎留言討論;如果本系列文章對你有幫助的話,那我很榮幸,別忘了打賞哦,O(∩_∩)O哈哈~

最后感謝你的閱讀,O(∩_∩)O哈哈~

繼續(xù)學(xué)習(xí)

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號