這是起底Git系列的第三篇,本篇我們來介紹一下Git的內(nèi)部工作原理。
你可能聽說過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)容:
下面會詳細(xì)介紹沒個部分都是什么
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
git通過一種算法可以得到任意文件的指紋(40位16進制數(shù)字),然后通過文件指紋存取數(shù)據(jù),存取的數(shù)據(jù)都位于objects目錄
objects目錄下有3種類型的數(shù)據(jù):
文件都被存儲為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目錄存儲都是引用文件,如本地分支,遠(yuǎn)端分支,標(biāo)簽等
引用文件的內(nèi)容都是40位commit
上面只有提交的圖補上分支后,如下所示
HEAD文件存儲的是當(dāng)前所在的位置,其內(nèi)容可以使分支名字,40位commit ID
$ cat HEAD
refs/heads/master
上面的圖補上HEAD后,如下所示:
如果你有任何疑問的話,歡迎留言討論;如果本系列文章對你有幫助的話,那我很榮幸,別忘了打賞哦,O(∩_∩)O哈哈~
最后感謝你的閱讀,O(∩_∩)O哈哈~
更多建議: