git對(duì)象庫是Git版本庫實(shí)現(xiàn)的核心,它包含了原始數(shù)據(jù)文件和所有的日志信息、作者信息、日期,已經(jīng)其他用來重建項(xiàng)目任意版本或者分支的信息。位于.git/objects目錄下。
├── HEAD
├── branches
├── config
├── description
├── hooks
│ ├── pre-commit.sample
│ ├── pre-push.sample
│ └── ...
├── info
│ └── exclude
├── objects
│ ├── info
│ └── pack
└── refs
├── heads
└── tags
git對(duì)象庫中有四種類型:塊(blob)、目錄樹(tree)、提交(commit)、標(biāo)簽(tag)。這四種原子對(duì)象構(gòu)成了Git高層數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)。
git對(duì)象的尋址使用40位的16進(jìn)制數(shù)表示,也就是SHA1或者散列碼,例如7f8aacaddffe009fff75b81187527c35a51f3eac。為了管理方便在文件系統(tǒng)中前兩位作為文件夾的名字,后38為作為文件名字。
你可能感覺用40位作為git對(duì)象的尋址ID,可能會(huì)存在不同的內(nèi)容但是散列碼相同的情況,你的感覺是正確的,但是這種情況出現(xiàn)的概率肯定可以忽略不計(jì)了。
其對(duì)象的關(guān)系如下:
blob對(duì)象存儲(chǔ)文件的時(shí)間內(nèi)容,實(shí)際為工作空間的文件內(nèi)容。具體為對(duì)文件內(nèi)容使用zlib算法壓縮,然后對(duì)得到的字節(jié)取hash算法。因此相同的文件內(nèi)容,得到的blob對(duì)象肯定是相同的。
示例:
git init temp -----初始化一個(gè)空的git倉(cāng)庫
cd temp
echo "Welcome to git">hello.txt
git add hello.txt ------添加到暫存器
此時(shí)我們查看.git/objects的目錄如下:
此時(shí)我們可以通過git cat-file命令查看git對(duì)象的內(nèi)容。注意cat-file命令可以查看所有的git對(duì)象。這個(gè)命令可以查看所有的git對(duì)象。
git cat-file -p b08a2810d8a4542f350f650435f506c6c81ca9b2
Welcome to git
由于git對(duì)文件內(nèi)容使用壓縮然后對(duì)內(nèi)容取hash作為文件名的特性,因此不管文件系統(tǒng)中同樣文件內(nèi)容有幾份,在git對(duì)象中都僅僅存一份。
git目錄樹對(duì)象映射操作系統(tǒng)中工作空間的目錄,不同的是工作空間的目錄下是文件和文件夾的集合,而目錄樹對(duì)象則為blob對(duì)象和目錄樹對(duì)象的集合。
mkdir src
cd src
cp ../hello.txt hello.txt
git add hello.txt
git write-tree -----git的內(nèi)部命令,commit命令基本等于write-tree 和commit-tree命令
此時(shí)我們使用write-tree命令返回的hash值使用cat命令
從圖中可以看出內(nèi)容相同的文件,blob是相同的,命令樹tree對(duì)象是對(duì)應(yīng)文件系統(tǒng)的文件夾的一個(gè)映射。
提交是我們使用git的時(shí)候經(jīng)常的動(dòng)作,每一個(gè)提交都執(zhí)行了一個(gè)目錄樹對(duì)象。同時(shí)提交也有一個(gè)或者多個(gè)父提交。我們現(xiàn)在使用commit-tree命令來關(guān)聯(lián)目錄樹對(duì)象吧(一般使用commit命令來自動(dòng)創(chuàng)建樹對(duì)象和關(guān)聯(lián)父提交)。
我們可以使用git $command --help來查看命令的資料文檔,例如git commit --help 、git pull --help
git commit-tree 5657a3b1d1454667d51f8c64c1fe9830276cdcea -m "1 commit" ----初次提交所以沒有指定父提交
7df70363051681bdd078b6a1a3fc9fe3d1595325 ----返回commit對(duì)象的HASH值
git cat-file -p 7df70363051681bdd078b6a1a3fc9fe3d1595325
tree 5657a3b1d1454667d51f8c64c1fe9830276cdcea
author xxxxxxx <xxxx@163.com> 1516538936 +0800
committer xxxx <xxxx@163.com> 1516538936 +0800
1 commit
注意此時(shí)當(dāng)我們使用git log命令并不會(huì)顯示剛剛的提交,需要使用 git merge 7df70363051681bdd078b6a1a3fc9fe3d1595325命令合并到master分支。可以看出git commit命令基本等于write-tree commit-tree merge命令。
現(xiàn)在我們修改工作空間中的hello.txt命令,然后提交查看目錄樹的內(nèi)容。
注意看tree對(duì)象和第一次提交隊(duì)對(duì)應(yīng)的tree對(duì)象相同,都是e15a40c68bd15301b60d21c204a5e7a87d62d8a1,而本身我們也沒有修改其文件夾下面的任何內(nèi)容。而blob對(duì)象32690ead83f3b77ad763e9e2c2e60ce3706cf117的內(nèi)容是兩行,說明git對(duì)象內(nèi)部提交指定的tree對(duì)象是工作空間的一個(gè)快照,而不是存儲(chǔ)的增量(否則內(nèi)容就是剛剛添加的一行了)。
標(biāo)簽僅僅是一個(gè)提交的快照,而且不允許修改其內(nèi)容。
$ git tag 1.0
$ git cat-file -p 1.0
tree f935b24b9a688ba5050fda30d70801c9092caeaa
parent 7df70363051681bdd078b6a1a3fc9fe3d1595325
author xxx <xxx@163.com> 1516542403 +0800
committer xxx <xxx@163.com> 1516542403 +0800
2 commit
git的blob對(duì)象使用字節(jié)流進(jìn)行存儲(chǔ),因此不存在編碼問題。
對(duì)于目錄樹對(duì)象對(duì)應(yīng)的路徑、commit對(duì)應(yīng)的message注釋,默認(rèn)都使用UTF-8編碼。
如果想修改編碼格式請(qǐng)參照(除非有特別的理由):https://git-scm.com/docs/git-commit/1.8.0.1#_discussion
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
本文名稱:git對(duì)象-創(chuàng)新互聯(lián)
文章URL:http://m.newbst.com/article18/dceidp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、面包屑導(dǎo)航、網(wǎng)站設(shè)計(jì)、App開發(fā)、手機(jī)網(wǎng)站建設(shè)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容