簡單易懂理解Git的工作原理(二)Index空間

上一篇文章中盗飒,我們解釋了Git的數(shù)據(jù)模型。在這一篇文章圆裕,我們來看看Git另一個(gè)重要的方面:index广鳍。Index空間,也叫做stage空間吓妆,或者cache空間赊时,集中了很多人對Git的誤解。在這篇文章里行拢,讓我來嘗試解開大家關(guān)于這方面的疑惑祖秒。

之前的我也對這部分有不少誤解。我曾經(jīng)以為舟奠,當(dāng)你新checkout一個(gè)commit以后竭缝,你的index將是一片空白。然后你通過git addindex添加需要更新的文件沼瘫。當(dāng)你commit以后抬纸,你的新修改文件會被加入到Git數(shù)據(jù)庫,然后你的index又會回到一片空白的狀態(tài)耿戚。

我的理解實(shí)際上包含了幾個(gè)錯(cuò)誤的地方:

  • Index并不是臨時(shí)存放新文件的地方
  • 新文件并不是在git commit的時(shí)候才被加入到Git的數(shù)據(jù)庫湿故。實(shí)際上在git add的時(shí)候就已經(jīng)被加入到數(shù)據(jù)庫里了。
  • Index包含的并不是當(dāng)前commit和新commit的diff

為了糾正這些錯(cuò)誤觀念膜蛔,我們就要研究一下index里面到底存放著什么信息坛猪。我們可以通過查看./.git/index這個(gè)文件來得到答案。讓我們繼續(xù)使用上一篇文章的例子:

$ git checkout master
$ git ls-files --stage
100644 bf97e71de76bcff2bd8aba44710aa5e665eacb99 0       dir/inside.txt
100644 8231f0fdc862f06b2bd7b7bfd2f42082d3086b71 0       index.txt

上面的命令列出index中存放的信息皂股。其中我們看到墅茉,即使我們是新checkout一個(gè)branch,index也不是空白的呜呐。它目前有兩個(gè)條目就斤,每個(gè)條目分別指向一個(gè)blob對象,而且還包含該blob對象所對應(yīng)的文件的路徑(分別是dir/inside.txtindex.txt)卵史。而且這兩個(gè)blob對象對應(yīng)的都是當(dāng)前commit中的文件版本战转。

讓我們現(xiàn)在來做點(diǎn)小試驗(yàn)。讓我們再次修改index.txt并添加到index中:

$ echo "version 3" > index.txt
$ git add index.txt
$ git ls-files --stage
100644 bf97e71de76bcff2bd8aba44710aa5e665eacb99 0       dir/inside.txt
100644 cd80567970da17e3c5d718e5b3db8700dbf320bf 0       index.txt

其實(shí)嚴(yán)格來說以躯,“把index.txt添加到index中”這個(gè)表述并不準(zhǔn)確槐秧。因?yàn)閷?shí)際上我們看到的是,當(dāng)我們執(zhí)行git add時(shí)忧设,新的index.txt已經(jīng)被作為一個(gè)新的blob對象添加到了Git數(shù)據(jù)庫中了刁标,而并不是被添加到index中。Git只是更新了index中這個(gè)文件的指針來指向新版本的blob對象址晕。如果我們此時(shí)執(zhí)行git commit膀懈,那么,Git將會基于index里面所指向的這些blob對象以及他們對應(yīng)的路徑來生成tree對象谨垃,最終生成commit對象(下圖)启搂。也就是說硼控,實(shí)際上index空間是新的commit的一個(gè)寫照(snapshot)

從index空間生成tree和commit對象

如果我們真正地明白這一點(diǎn)胳赌,那么很多本來覺得不自然的操作都顯得理所應(yīng)當(dāng)了牢撼。例如,如果我們想讓Git不再追蹤一個(gè)文件疑苫,那么我們該怎么做呢熏版?每當(dāng)想到index是新commit的寫照,那么我們就應(yīng)該想到要移除index里面關(guān)于這個(gè)文件的條目捍掺。例如在我們的例子中撼短,如果我想停止跟蹤dir/inside.txt

$ git rm --cache dir/inside.txt
$ git ls-files --stage
100644 cd80567970da17e3c5d718e5b3db8700dbf320bf 0       index.txt

又例如,我們有如下的歷史:
HEADcommit 5commit 4commit 3commit 2commit 1
如果我們想要合并commit 5, commit 4commit 3挺勿,其中一種簡單的方法就是使用git reset --soft如下:

$ git reset --soft [commit 2]
$ git commit -m "commit 6"

這樣會得到以下結(jié)果:
HEADcommit 6commit 2commit 1
原因就是曲横,git reset --soft只把HEAD移到了commit 2,index并沒有變化满钟,所以新執(zhí)行的commit是基于commit 2的(因?yàn)?code>HEAD指向commit 2)胜榔,但卻會保留commit 5的內(nèi)容。

解釋了那么多湃番,其實(shí)我想說的是夭织,理解index的工作原理有助于我們自主去想解決的辦法,而不是生搬硬套網(wǎng)上搜來的解決方法吠撮,是提高水平的一大重要途徑尊惰。

簡單易懂理解Git的工作原理(一)Git數(shù)據(jù)模型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市泥兰,隨后出現(xiàn)的幾起案子弄屡,更是在濱河造成了極大的恐慌,老刑警劉巖鞋诗,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膀捷,死亡現(xiàn)場離奇詭異,居然都是意外死亡削彬,警方通過查閱死者的電腦和手機(jī)全庸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來融痛,“玉大人,你說我怎么就攤上這事雁刷。” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵炮障,是天一觀的道長。 經(jīng)常有香客問我鹦筹,道長铝阐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮遍蟋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘螟凭。我一直安慰自己虚青,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布螺男。 她就那樣靜靜地躺著棒厘,像睡著了一般下隧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淆院,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天土辩,我揣著相機(jī)與錄音支救,去河邊找鬼拷淘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛启涯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逝嚎,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼补君,長吁一口氣:“原來是場噩夢啊……” “哼引几!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起敞掘,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤楣铁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后盖腕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劲厌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年听隐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雅任。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖硼婿,靈堂內(nèi)的尸體忽然破棺而出成玫,到底是詐尸還是另有隱情加酵,我是刑警寧澤哭当,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站陋葡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏腐缤。R本人自食惡果不足惜肛响,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望特笋。 院中可真熱鬧,春花似錦虎囚、人聲如沸角塑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窒朋。三九已至,卻和暖如春炼邀,著一層夾襖步出監(jiān)牢的瞬間剪侮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工瓣俯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兵怯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓驼仪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绪爸。 傳聞我的和親對象是個(gè)殘疾皇子宙攻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • 可能你每天都在用Git,但是你真的了解Git的內(nèi)部是如何工作的嗎座掘?也許你跟之前的我一樣,對Git的工作原理不甚了解...
    Jo的工作筆記閱讀 4,352評論 2 20
  • 一則警方通報(bào),將數(shù)千人的“發(fā)財(cái)夢”徹底打碎王财。近日,深圳南山警方召開新聞通氣會绒净,通報(bào)了一起以發(fā)行虛擬貨幣為名、行詐騙...
    八卦狐貍閱讀 637評論 0 0
  • 場景分析 商城系統(tǒng)中常見的商品分類改览,以電腦為例,如何良好的處理商品分類銷售的問題宝当? 這個(gè)場景有兩個(gè)維度:電腦類型胆萧、...
    忘凈空閱讀 492評論 0 0
  • 曾經(jīng),羨慕那些不用工作的女人跌穗, 有時(shí),為一個(gè)訂單忙得昏天黑地蚌吸,回想整個(gè)過程是否還有繼續(xù)跟進(jìn)的可能; 有時(shí),為修改一...
    劉彥霞閱讀 209評論 0 0