Git是如何保存作者和時間等信息的---提交對象

提交對象

一般我們平時有了需要提交的文件,都是2步走:add,然后commit

add操作

第一步:添加文件

//添加文件到暫存區(qū)
git add test.txt

這一步Git做了2件事:

  • 將文件的內容用之前數據對象一節(jié)中提到的方法創(chuàng)建數據對象并保存到Git數據庫中(計算SHA-1值拴签、生成文件目錄、寫入壓縮后的內容)
  • 更新 Index文件洗显,也就是我們平時說的 暫存區(qū)棱貌,增加或是更新指向text.txt 文件的索引,等待后續(xù)的第二步操作
commit:創(chuàng)建提交記錄
//提交到Git本地倉庫
git commit -m "XXX"

這個步驟是創(chuàng)建了一個提交對象精续,提交對象里面就記錄了提交的時間坝锰、作者、以及提交的原因等信息重付。

上述 git commit 命令做了以下幾件事:

  • 首先所有具體文件的數據顷级,已經在 add 操作時用數據對象記錄在Git數據庫中,并且所有文件的索引都保存在暫存區(qū)中确垫,所以 commit 操作就不用再創(chuàng)建數據對象了

  • 如果暫存區(qū)中存在目錄關系弓颈,就會先創(chuàng)建樹對象來記錄文件目錄關系,這樣文件數據和目錄關系都有了記錄

  • 然后會再創(chuàng)建一個樹對象删掀,代表當前項目快照翔冀,這個樹對象里面包含的就是上述信息,也就是所有要保存記錄的數據

  • 然后用這個樹對象爬迟,配置中的user.name和email橘蜜,以及當前的時間戳和 -m 參數后面的內容生成提交對象

我們可以用 git log 命令,查看提交的歷史記錄,就能拿到 commit 的 SHA-1值(也就是我們平時說的commit id)

然后用 git cat-file 命令就能查看這個提交里面的信息

git cat-file -p xxxxxxx0ab25ce7b1c6019c411e760a17205d7b0
//輸出
tree 9bfb857f532d280ecd7704beb40a2ea4ba332f5a
author xxx <xxx@qq.com> 1561964726 +0800
committer xxx <xxx@qq.com> 1561964726 +0800

first commit

可以看到计福,commit 里面確實是有一個樹的索引跌捆,這個樹對象就是前面創(chuàng)建的頂層樹對象。

此時象颖,有個疑問:已經用暫存區(qū)的內容創(chuàng)建了提交對象佩厚,那暫存區(qū)的內容還在嗎?

答案是:仍然存在

Git在執(zhí)行commit命令時會根據暫存區(qū)創(chuàng)建樹對象说订,暫存區(qū)沒變抄瓦,創(chuàng)建的樹對象就是同一個,也就是不會重復創(chuàng)建陶冷。

最后我們看看commit對象的一個示意圖

commit歷史記錄

上面我們用 git commit 命令創(chuàng)建了一個commit對象钙姊,實際上底層調用的是 commit-tree 命令。

commit-tree 命令里面需要確定2個參數:一個是需要指定一個樹對象埂伦,第二個需要指定上一個提交對象(作為父提交對象)

// -p 后面的就是上一個提交對象
echo 'second commit' | git commit-tree 0155eb -p fdf4fc3

下面我們來模擬連續(xù)提交3次

echo 'version 1' > test.txt
git add .
git write-tree
//輸出樹對象SHA-1值
d8329fc1cc938780ffdd9f94e0d364e0ea74f579

//創(chuàng)建第一個提交對象
echo 'first commit' | git commit-tree d8329fc
//輸出提交對象的SHA-1值
xxxxxxxc670d30e9817fd1af481aca92f8d700c2

//然后添加新文件煞额,創(chuàng)建新的樹對象
echo 'version 2' > test.txt 
echo 'new file' > new.txt
git add .
git write-tree 
//輸出新的樹對象的SHA-1值
0155eb4229851634a0f03eb265b69f5a2d56f341

//接著創(chuàng)建新的提交對象
echo 'second commit' | git commit-tree 0155eb -p 9f17fcc
//輸出新提交對象的SHA-1值
xxxxxxx9f57c7a0632084e2c9eb38e3584180e23


//先把之前的第一版的test.txt讀入暫存區(qū)作為子樹
git read-tree --prefix=bak d8329fc1cc938780ffdd9f94e0d364e0ea74f579
git write-tree
//輸出新樹的SHA-1值
3c4e9cd789d88d8d89c1073707c3585e41b0e614

//接著創(chuàng)建新的提交對象
echo 'third commit' | git commit-tree 3c4e9c -p 8565637
//輸出第3次提交的SHA-1值
xxxxxxx747d9e83f3c05d10cbc68f876a8abf0d1

以上我們用 git的底層命令模擬了實際的三次 git commit操作,我們來看一下成果:

//--stat參數可以讓git顯示每一次提交改動的文件信息
git log --stat f32da7d

通過以上的步驟我們就從底層知道了我們每次 git addgit commit 的過程沾谜,同時我們知道膊毁,每一次我們 commit 的時候,都會記錄上一個 commit 的 SHA-1值基跑,這樣一個個的 commit 就串起了我們的提交記錄婚温。

那么問題來了,Git是怎么知道新 commit 對象的上一個 commit 對象的呢媳否?實際上就是上面commit-tree 命令中的第二個參數---父提交對象栅螟,每個提交對象都保存了上一個父提交對象的引用,這樣就串起來一個提交歷史記錄了篱竭。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末嵌巷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子室抽,更是在濱河造成了極大的恐慌,老刑警劉巖靡努,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坪圾,死亡現(xiàn)場離奇詭異,居然都是意外死亡惑朦,警方通過查閱死者的電腦和手機兽泄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漾月,“玉大人病梢,你說我怎么就攤上這事。” “怎么了蜓陌?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵觅彰,是天一觀的道長。 經常有香客問我钮热,道長填抬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任隧期,我火速辦了婚禮飒责,結果婚禮上,老公的妹妹穿的比我還像新娘仆潮。我一直安慰自己宏蛉,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布性置。 她就那樣靜靜地躺著拾并,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚌讼。 梳的紋絲不亂的頭發(fā)上辟灰,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音篡石,去河邊找鬼芥喇。 笑死,一個胖子當著我的面吹牛凰萨,可吹牛的內容都是我干的继控。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼胖眷,長吁一口氣:“原來是場噩夢啊……” “哼武通!你這毒婦竟也來了?” 一聲冷哼從身側響起珊搀,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤冶忱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后境析,有當地人在樹林里發(fā)現(xiàn)了一具尸體囚枪,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年劳淆,在試婚紗的時候發(fā)現(xiàn)自己被綠了链沼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡沛鸵,死狀恐怖括勺,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤疾捍,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布奈辰,位于F島的核電站,受9級特大地震影響拾氓,放射性物質發(fā)生泄漏冯挎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一咙鞍、第九天 我趴在偏房一處隱蔽的房頂上張望房官。 院中可真熱鬧,春花似錦续滋、人聲如沸翰守。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜡峰。三九已至,卻和暖如春朗恳,著一層夾襖步出監(jiān)牢的瞬間湿颅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工粥诫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留油航,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓怀浆,卻偏偏與公主長得像谊囚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子执赡,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容