Git學習筆記(一)—— Git對象模型

圖片發(fā)自簡書App

Git對象

在Git系統(tǒng)中有四種類型的對象减江,幾乎所有Git操作都是在這四種Git對象上進行的染突,所以了解這四種對象的作用對于應用Git有很大幫助。這四種對象是:

  • “blob”:一個“blob”通常用來存儲文件的內(nèi)容辈灼。一個“blob”對象就是一塊二進制數(shù)據(jù)份企,它沒有指向任何東西或有任何其它屬性,甚至沒有文件名巡莹。因為“blob”對象內(nèi)容全部都是數(shù)據(jù)司志,所以如若兩個文件在一個目錄樹或是一個版本倉庫中有同樣的數(shù)據(jù)內(nèi)容,那么它們將會共享同一個“blob”對象降宅÷钤叮“blob”對象和其所對應的文件所在路徑、文件名是否改被更改都完全沒有關(guān)系腰根。
  • “tree”:像一個目錄激才,管理一些“tree”對象或是“blob”對象。它有一串指向“blob”對象或是其它“tree”對象的指針额嘿,一般用來表示內(nèi)容之間的目錄層次關(guān)系(就像文件和子目錄)瘸恼。
  • “commit”:“commit”對象指向一個“tree對象”,并且?guī)в邢嚓P(guān)的描述信息册养,標記項目某一個特定時間點的狀態(tài)东帅。它包括一些關(guān)于時間點的元數(shù)據(jù),如時間戳捕儒、最近一次提交的作者冰啃、指向上次提交的指針等等邓夕。
  • “tag”:一個“tag”對象包括一個對象名(SHA1簽名)刘莹、對象類型、標簽名焚刚、標簽創(chuàng)建人的名字(“tagger”), 還有一條可能包含有簽名(signature)的消息点弯。

例如我們有一個項目,如果我們把它提交(commit)到一個Git倉庫中, 在Git中“blob”矿咕、“commit”和“tree”對象的關(guān)系看起來會如下圖:

objects-example.jpg

可以看到: 每個目錄都創(chuàng)建了“tree”對象, 每個文件都創(chuàng)建了一個對應的“blob”對象抢肛。最后有一個“commit”對象來指向根“tree”對象,這樣我們就可以追蹤項目每一項提交內(nèi)容碳柱。

SHA1哈希值

另外在Git里隨處可見一種“40個字符”的字符串捡絮。由于Git中每一個“對象名”都是對“對象”內(nèi)容做SHA1(SHA1是一種密碼學的哈希算法)哈希計算得來的,所以對于內(nèi)容不同的對象莲镣,會有不同的SHA1哈希值福稳。這樣就意味著兩個不同內(nèi)容的對象不可能有相同的“對象名”。

例如  6ff87c4664981e4397625791c8ea3bbb5f2279a3

這樣做的好處是:

  • Git只要比較對象名瑞侮,就可以很快的判斷兩個對象是否相同的圆,而且通過檢查對象內(nèi)容的SHA1的哈希值和“對象名”是否相同鼓拧,還可以來判斷對象內(nèi)容是否正確。
  • 因為在每個repository的“對象名”的計算方法都完全一樣越妈,所以同樣的內(nèi)容存在兩個不同的倉庫中季俩,都會存在相同的“對象名”下。

查看對象

  • 查看“blob”對象:git show + 對象名(SHA1哈希值)
  • 查看“tree”對象:git show + 對象名 / git ls-tree + 對象名
  • 查看“commit”對象:git show / git log + -s + --pretty=raw +對象名
  • 查看“tag”對象:git cat-file tag v1.5.0

著重說一下“tree”和“commit”對象

  • “tree”:
$ git ls-tree fb3a8bdd0ce
100644 blob 63c918c667fa005ff12ad89437f2fdc80926e21c    .gitignore
100644 blob 5529b198e8d14decbe4ad99db3f7fb632de0439d    .mailmap
100644 blob 6ff87c4664981e4397625791c8ea3bbb5f2279a3    COPYING
040000 tree 2fb783e477100ce076f6bf57e4a6f026013dc745    Documentation
100755 blob 3c0032cec592a765692234f1cba47dfdcc3a9200    GIT-VERSION-GEN
100644 blob 289b046a443c0647624607d471289b2c7dcd470b    INSTALL
100644 blob 4eb463797adc693dc168b926b6932ff53f17d0b1    Makefile
100644 blob 548142c327a6790ff8821d67c2ee1eff7a656b52    README

如上:一個tree對象包括一串條目梅掠,每一個條目包括:mode(mode位都是644 或 755酌住,這意味著Git只關(guān)心文件的可執(zhí)行位.)、對象類型瓤檐、對象名和文件名字赂韵。它用來表示一個目錄樹的內(nèi)容。
一個tree對象可以指向一個包含文件內(nèi)容的blob對象挠蛉,也可以是包含某個子目錄內(nèi)容的其它tree對象祭示。“tree”對象谴古、“blob”對象和其它所有的對象一樣质涛,都用其內(nèi)容的SHA1哈希值來命名的;只有當兩個tree對象的內(nèi)容完全相同(包括其所指向所有子對象)時掰担,它的名字才會一樣汇陆,反之亦然。這樣就能讓Git僅僅通過比較兩個相關(guān)的tree對象的名字是否相同带饱,來快速的判斷其內(nèi)容是否不同毡代。在有些情況下,“tree”對象也可以指向“commit”對象勺疼。

  • “commit”:
$ git show -s --pretty=raw 2be7fcb476
commit 2be7fcb4764f2dbcee52635b91fedb1b3dcf7ab4
tree fb3a8bdd0ceddd019615af4d57a53f43d8cee2bf
parent 257a84d9d02e90447b149af58b271c19405edb6a
author Dave Watson <dwatson@mimvista.com> 1187576872 -0400
committer Junio C Hamano <gitster@pobox.com> 1187591163 -0700

    Fix misspelling of 'suppress' in docs

    Signed-off-by: Junio C Hamano <gitster@pobox.com>

可以看到教寂,一個提交(commit)由以下的部分組成:

  • 一個“tree”對象:“tree”對象的SHA1簽名,代表著目錄在某一時間點的內(nèi)容执庐。
  • 父對象(parent(s)):提交的SHA1簽名代表著當前提交前一步的項目歷史酪耕。上面的那個例子就只有一個父對象;合并的提交(merge commits)可能會有不只一個父對象轨淌。如果一個提交沒有父對象迂烁,那么我們就叫它“根提交”(root commit),它就代表著項目最初的一個版本(revision)递鹉。每個項目必須有至少有一個“根提交”(root commit)盟步。一個項目可能有多個“根提交”,雖然這并不常見躏结。
  • 作者:做了此次修改的人的名字却盘,還有修改日期。
  • 提交者(committer):實際創(chuàng)建提交(commit)的人的名字,同時也帶有提交日期谷炸”弊ǎ可能會和作者不是同一個人;例如作者寫一個補丁(patch)并把它用郵件發(fā)給提交者, 由他來創(chuàng)建提交(commit)旬陡。
  • 注釋:用來描述此次提交.

一個提交本身并沒有包括任何信息來說明其做了哪些修改拓颓;所有的修改(changes)都是通過與父提交(parents)的內(nèi)容比較而得出的。盡管git可以檢測到文件內(nèi)容不變而路徑改變的情況描孟,但是它不會去顯式(explicitly)記錄文件的更名操作驶睦。

一般用git commit來創(chuàng)建一個提交(commit), 這個提交的父對象一般是當前分支(current HEAD),同時把存儲在當前索引(index)的內(nèi)容全部提交匿醒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末场航,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子廉羔,更是在濱河造成了極大的恐慌溉痢,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憋他,死亡現(xiàn)場離奇詭異孩饼,居然都是意外死亡,警方通過查閱死者的電腦和手機竹挡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門镀娶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揪罕,你說我怎么就攤上這事梯码。” “怎么了好啰?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵轩娶,是天一觀的道長。 經(jīng)常有香客問我坎怪,道長罢坝,這世上最難降的妖魔是什么廓握? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任搅窿,我火速辦了婚禮,結(jié)果婚禮上隙券,老公的妹妹穿的比我還像新娘男应。我一直安慰自己,他們只是感情好娱仔,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布沐飘。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耐朴。 梳的紋絲不亂的頭發(fā)上借卧,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機與錄音筛峭,去河邊找鬼铐刘。 笑死,一個胖子當著我的面吹牛影晓,可吹牛的內(nèi)容都是我干的镰吵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼挂签,長吁一口氣:“原來是場噩夢啊……” “哼疤祭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饵婆,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勺馆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后侨核,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谓传,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年芹关,在試婚紗的時候發(fā)現(xiàn)自己被綠了续挟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡侥衬,死狀恐怖诗祸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轴总,我是刑警寧澤直颅,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站怀樟,受9級特大地震影響功偿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜往堡,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一水援、第九天 我趴在偏房一處隱蔽的房頂上張望筹淫。 院中可真熱鬧,春花似錦、人聲如沸池磁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谜慌。三九已至字旭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崖叫,已是汗流浹背遗淳。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留心傀,地道東北人洲脂。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像剧包,于是被迫代替她去往敵國和親恐锦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

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