Git工作原理

按照官方文檔的描述,Git是這樣定義的

  • 內(nèi)容尋址(content-addressable)文件系統(tǒng),在此之上提供了一個VCS用戶界面
  • Git采用HashTable的方式進(jìn)行查找铃将,通過簡單的存儲鍵值對的方式來實現(xiàn)內(nèi)容尋址择懂,key是文件頭和內(nèi)容組成的40位hash值运敢,value是壓縮過后的文件內(nèi)容
    當(dāng)然耗帕,這句話寫得并不是很容易讓人明白穆端,通過查看git的目錄結(jié)構(gòu)以及細(xì)致地分析一次Git提交可以更好地幫助理解Git

.git目錄

.git目錄是Git的核心,每一個變動都會存儲在.git文件夾中仿便,Git的相關(guān)命令本質(zhì)上也是讀取.git文件夾下的內(nèi)容
.git目錄下有幾個重要的文件/文件夾

  • config文件体啰,主要存儲項目的一些配置信息
  • objects文件夾, 存儲git對象
  • HEAD文件探越,記錄當(dāng)前的頭指針
  • index文件狡赐,存儲暫存區(qū)的信息
  • refs文件夾窑业, 存儲分支的指針

git對象

提交和文件是Git中的主要組成钦幔,也叫g(shù)it對象,Git中的許多命令都和git對象有關(guān)
git對象分為下面3類


image.png

git對象存儲在.git目錄下的objects文件夾中常柄,Git會將git對象壓縮成二進(jìn)制文件鲤氢,git對象的文件名即sha-1算法得到的hash值,按照2/38的形式保存(前兩位是文件夾的名稱西潘,剩下38位是文件名卷玉,這樣做可以防止文件夾的內(nèi)容過多,提高查找效率)

對于commit對象喷市,hash值也被稱為commitid

可以使用以下命令查看git對象中的內(nèi)容

git cat-file -p <hash>

通過查看三種git對象的內(nèi)容相种,不難發(fā)現(xiàn)如下的組織關(guān)系


image.png
  • 每個commit的對象包含了tree和blob對象的hash
  • 每個tree對象包含了blob文件的hash
  • 每個blob對象是真正文件的二進(jìn)制保存

其實可以吧hash看成每個對象的指針,Git通過指針將眾多git對象串聯(lián)起來品姓,來實現(xiàn)對項目的版本控制

從Git命令看一次提交的完整過程

用戶通過Git命令讀寫.git文件夾寝并,達(dá)到獲取信息或變更版本的目的

Git一開始被設(shè)計成供VCS使用的工具集合而不是一整套用戶有好的VCS,它還包含了許多的底層命令腹备,一般被稱為plumbing命令(底層命令)衬潦,而用戶日常使用Git命令被稱為porcelain命令(高層命令),porcelain命令實際是是對plumbing命令的封裝

image.png

一次完整的提交過程會包含如下過程

  • 保存二進(jìn)制對象(即生成blob對象)
  • 寫入暫存區(qū)
  • 保存目錄結(jié)構(gòu)(生成tree對象)
  • 提交目錄結(jié)構(gòu) (指定上一個提交的hash并生成commit對象)
  • 更新分支(更新分支指向的hash)

使用porcelain命令的話是非常簡單的

git add <file>
git commit -m "commit message"

如果使用plumbing命令就會復(fù)雜很多植酥,但是可以更好地理解其背后的工作原理

git hash-object -w <file>
git update-index <file>
git write-tree
echo "commit message" | git commit-tree writetreehash -p <last commit hash>
echo <commit hash> .git/refs/heads/<branchname>

Git分支和HEAD

通過前文的內(nèi)容不難發(fā)現(xiàn)镀岛,每次生成的commit對象會包含上一個commit對象的hash,即當(dāng)前的commit包含上一個commit的指針友驮,許多個commit對象串聯(lián)起來就形成了分支

所以漂羊,Git的分支本質(zhì)上是指向commit對象的可變指針

而HEAD代表當(dāng)前commit的指向,.git/refs/heads/<branchname>文件的內(nèi)容就是該commit對象的hash

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卸留,一起剝皮案震驚了整個濱河市拨与,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艾猜,老刑警劉巖买喧,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捻悯,死亡現(xiàn)場離奇詭異,居然都是意外死亡淤毛,警方通過查閱死者的電腦和手機(jī)今缚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來低淡,“玉大人姓言,你說我怎么就攤上這事≌崽#” “怎么了何荚?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猪杭。 經(jīng)常有香客問我餐塘,道長,這世上最難降的妖魔是什么皂吮? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任戒傻,我火速辦了婚禮,結(jié)果婚禮上蜂筹,老公的妹妹穿的比我還像新娘需纳。我一直安慰自己,他們只是感情好艺挪,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布不翩。 她就那樣靜靜地躺著,像睡著了一般麻裳。 火紅的嫁衣襯著肌膚如雪口蝠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天掂器,我揣著相機(jī)與錄音亚皂,去河邊找鬼。 笑死国瓮,一個胖子當(dāng)著我的面吹牛灭必,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播乃摹,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼禁漓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了孵睬?” 一聲冷哼從身側(cè)響起播歼,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后秘狞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叭莫,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年烁试,在試婚紗的時候發(fā)現(xiàn)自己被綠了雇初。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡减响,死狀恐怖靖诗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情支示,我是刑警寧澤刊橘,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站颂鸿,受9級特大地震影響促绵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜据途,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一绞愚、第九天 我趴在偏房一處隱蔽的房頂上張望叙甸。 院中可真熱鬧颖医,春花似錦、人聲如沸裆蒸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僚祷。三九已至佛致,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辙谜,已是汗流浹背俺榆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留装哆,地道東北人罐脊。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蜕琴,于是被迫代替她去往敵國和親萍桌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容