git

本質(zhì):Git是一套內(nèi)容尋址(content-addressable)文件系統(tǒng)

.git 目錄結(jié)構(gòu):


image.png
config文件:

該文件主要記錄針對該項目的一些配置信息,例如是否以bare方式初始化、remote的信息等奸披,通過git remote add命令增加的遠(yuǎn)程分支的信息就保存在這里藻茂;

objects文件夾:

該文件夾主要包含git對象。Git中的文件和一些操作都會以git對象來保存,git對象分為BLOB赁温、tree和commit三種類型速兔,例如git commit便是git中的commit對象墅拭,而各個版本之間是通過版本樹來組織的,比如當(dāng)前的HEAD會指向某個commit對象涣狗,而該commit對象又會指向幾個BLOB對象或者tree對象谍婉。objects文件夾中會包含很多的子文件夾,其中Git對象保存在以其sha-1值的前兩位為子文件夾镀钓、后38位位文件名的文件中穗熬;除此以外,Git為了節(jié)省存儲對象所占用的磁盤空間丁溅,會定期對Git對象進(jìn)行壓縮和打包唤蔗,其中pack文件夾用于存儲打包壓縮的對象,而info文件夾用于從打包的文件中查找git對象窟赏;

HEAD文件:

該文件指明了git branch(即當(dāng)前分支)的結(jié)果妓柜,比如當(dāng)前分支是master,則該文件就會指向master涯穷,但是并不是存儲一個master字符串棍掐,而是分支在refs中的表示,例如ref: refs/heads/master拷况。

index文件:

該文件保存了暫存區(qū)域的信息作煌。該文件某種程度就是緩沖區(qū)(staging area),內(nèi)容包括它指向的文件的時間戳赚瘦、文件名粟誓、sha1值等;

Refs文件夾:

該文件夾存儲指向數(shù)據(jù)(分支)的提交對象的指針起意。其中heads文件夾存儲本地每一個分支最近一次commit的sha-1值(也就是commit對象的sha-1值)鹰服,每個分支一個文件;remotes文件夾則記錄你最后一次和每一個遠(yuǎn)程倉庫的通信杜恰,Git會把你最后一次推送到這個remote的每個分支的值都記錄在這個文件夾中获诈;tag文件夾則是分支的別名仍源,這里不需要對其有過多的了解;

git 底層

Git分為porcelain命令和plumbing命令舔涎,而porcelain命令是基于plumbing來實(shí)現(xiàn)的笼踩。(porcelain高級命令,一個操作命令可以拆解為多個plumbing亡嫌,plumbing為底層命令)如果把Git比作Linux操作系統(tǒng)嚎于,那plumbing命令就有點(diǎn)類似于shell命令,而上層的procelain命令便是利用shell命令編寫的一系列的系統(tǒng)功能或工具挟冠,如你自定義的自動化運(yùn)維工具等于购。在接下來的介紹中,我們將試著如何利用plumbing命令知染,而不是porcelain命令肋僧,來完成Git的暫存和提交工作,并利用log查看提交記錄控淡。首先嫌吠,我們從Git的對象介紹開始。

Git是一套內(nèi)容尋址(content-addressable)文件系統(tǒng)掺炭,那么Git是怎么進(jìn)行尋址呢辫诅?其實(shí),尋址無非就是查找涧狮,而Git采用HashTable的方式進(jìn)行查找炕矮,也就是說,Git只是通過簡單的存儲鍵值對(key-value pair)的方式來實(shí)現(xiàn)內(nèi)容尋址的者冤,而key就是文件(頭+內(nèi)容)的哈希值(采用sha-1的方式肤视,40位),value就是經(jīng)過壓縮后的文件內(nèi)容涉枫。因此钢颂,在接下來的實(shí)踐中,我們會經(jīng)常通過40位的hash值來進(jìn)行plumbing操作拜银,幾乎每一個plumbing命令都需要通過key來指定所要操作的對象。

git 對象

BLOB:

可以存儲幾乎所有的文件類型遭垛,全稱為binary large object尼桶,顧名思義,就是大的二進(jìn)制表示的對象锯仪,這種對象類型和數(shù)據(jù)庫中的BLOB類型(經(jīng)常用來在數(shù)據(jù)庫中存儲圖片泵督、視頻等)是一樣的,當(dāng)作一種數(shù)據(jù)類型即可庶喜;
Git對象的存儲方式也很簡單小腊,基本可以用如下表達(dá)式來表示:

tree:

tree對象是用來組織BLOB對象的一種數(shù)據(jù)類型救鲤,你完全可以把它想象成二叉樹中的樹節(jié)點(diǎn),只不過Git中的樹不是二叉樹秩冈,而是"多叉樹"本缠;一個tree對象中可以包含tree對象及blob對象(也可以將tree想象成文件夾,blob為文件)

commit:

commit對象表示每一次的提交操作入问,由tree對象衍生丹锹,每一個commit對象表示一次提交,在創(chuàng)建的過程中可以指定該commit對象的父節(jié)點(diǎn)芬失,這樣所有的commit操作便可以連接在一起楣黍,而這些commit對象便組成了提交樹。另外棱烂,commit還會包含提交的相關(guān)信息

使用plumbing命令解讀git

1. add命令

首先租漂,我們先初始化一個倉庫:


image.png

初始化之后,會在當(dāng)前目錄下生成.git目錄颊糜,進(jìn)入該目錄哩治,就會發(fā)現(xiàn)我們上述的目錄結(jié)構(gòu)。然后芭析,我們新建一個version.txt文件并在文件中寫入"version 1"字符串锚扎,這是version.txt的第一個版本,然后利用git hash-object –w命令將該文件轉(zhuǎn)換為Git的對象并存儲馁启,如下圖:

image

這里hash-objec命令會返回該Git對象的key值驾孔,這時到.git目錄的objects目錄下會發(fā)現(xiàn),多了一個6c子目錄惯疙,該目錄中的文件名稱為58b76a52188643965f3a6704166e8e0424b7fe翠勉,也就是該key值的后38位。記下該key值霉颠,因?yàn)槲覀円鶕?jù)該key值將該對象加入索引庫对碌。接著,我們利用update-index命令進(jìn)行索引化操作蒿偎,如下圖:

image

注意朽们,這里一定要帶上—add選項,而—cacheinfo選項則指出該文件的文件類型诉位,100644表示普通文件骑脱,與之相關(guān)的還有可執(zhí)行文件等等;并且苍糠,除了指定key值叁丧,還需要指定文件名,表明要把哪個文件的哪個版本加入索引庫。該命令執(zhí)行完成后拥娄,可以發(fā)現(xiàn).git目錄下多了index文件蚊锹,并且在以后每次update-index命令執(zhí)行之后,該index文件的內(nèi)容都會發(fā)生變化稚瘾。至此牡昆,git add的主要過程也便完成了。

add 的操作:

1.在objects路徑下生成對象
2.生成index的文件索引


這里我們簡單談一下index文件孟抗。index是一個索引文件迁杨,存放的是暫存區(qū)的整個目錄樹的信息,并且為目錄樹中的每個文件都保存了時間戳和長度凄硼。如果用UltraEdit打開使用過程中的index文件铅协,可以發(fā)現(xiàn)index的格式為以下形式:

   Index魔數(shù)(DIRC) + 版本號 + 暫存的文件個數(shù) + 每個文件的時間戳和長度

Index索引庫記錄從項目初始化到目前為止,項目倉庫中所有文件最后一次修改時刻的時間戳以及對應(yīng)的長度信息摊沉,因此隨著加入倉庫中的文件不斷增多狐史,index文件也會不斷增大。每次調(diào)用git add命令说墨,都會把a(bǔ)dd的文件的索引信息(時間戳和大锌ト)進(jìn)行更新,而我們所使用的git status命令尼斧,則會把每一個文件的索引信息和上次提交的索引信息進(jìn)行比較姜贡,如果發(fā)生了變化,就會顯示出來棺棵。Pro git 中是這樣描述暫存操作的:暫存操作會對每一個文件計算校驗(yàn)和(即第一章中提到的 SHA-1 哈希字串)楼咳,然后把當(dāng)前版本的文件快照保存到 Git 倉庫中(Git 使用 blob 類型的對象存儲這些快照),并將校驗(yàn)和加入暫存區(qū)域烛恤。意思很明確母怜,也就是每個文件對應(yīng)的當(dāng)前版本的key也會加入到index文件中

2. commit 命令

生成commit對象
commit對象會包含工作目錄的根tree對象,上一個commit的hashKey(parent)缚柏,以及提交的備注苹熏、提交人、提交時間等相關(guān)信息


image.png

參考:https://www.cnblogs.com/yelbosh/p/7471979.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末币喧,一起剝皮案震驚了整個濱河市轨域,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杀餐,老刑警劉巖疙挺,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異怜浅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門恶座,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搀暑,“玉大人,你說我怎么就攤上這事跨琳∽缘悖” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵脉让,是天一觀的道長桂敛。 經(jīng)常有香客問我,道長溅潜,這世上最難降的妖魔是什么术唬? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮滚澜,結(jié)果婚禮上粗仓,老公的妹妹穿的比我還像新娘。我一直安慰自己设捐,他們只是感情好借浊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萝招,像睡著了一般蚂斤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上槐沼,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天曙蒸,我揣著相機(jī)與錄音,去河邊找鬼母赵。 笑死逸爵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凹嘲。 我是一名探鬼主播师倔,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼周蹭!你這毒婦竟也來了趋艘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤凶朗,失蹤者是張志新(化名)和其女友劉穎瓷胧,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棚愤,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搓萧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年杂数,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘸洛。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡揍移,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出反肋,到底是詐尸還是另有隱情那伐,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布石蔗,位于F島的核電站罕邀,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏养距。R本人自食惡果不足惜诉探,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铃在。 院中可真熱鬧阵具,春花似錦、人聲如沸定铜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揣炕。三九已至帘皿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畸陡,已是汗流浹背鹰溜。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留丁恭,地道東北人曹动。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像牲览,于是被迫代替她去往敵國和親墓陈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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

  • Git 基礎(chǔ) 基本原理 客戶端并不是只提取最新版本的文件快照第献,而是把代碼倉庫完整的鏡像下來贡必。這樣一來,任何一處協(xié)同...
    __silhouette閱讀 15,883評論 5 147
  • 先談?wù)勎覍啎牡谝挥∠蟆?我是在16年4月份庸毫,一個好朋友的推薦下仔拟,注冊了簡書。正如簡書其名飒赃,簡約大方的頁面風(fēng)格和...
    九月說閱讀 400評論 1 6
  • 昨天我和老公都放年假了利花,臨近傍晚爸媽過來看了看孩子科侈。之后我隨爸媽回去吃晚飯,待了大概四個多小時吧炒事,這期間三個人配合...
    sunlovehe閱讀 178評論 1 0