前言
年前在公司內(nèi)部做了一次git原理分享,現(xiàn)在在這里分享其中核心部分之一:關(guān)于git add和commit命令的深入理解。我盡力用最淺顯的文字和生動(dòng)的圖片讓大家了解git原理,當(dāng)然有不足之處還望大牛指點(diǎn)批評(píng)。
目錄
1、理解幾個(gè)概念:git倉(cāng)庫(kù)(版本庫(kù))、暫存區(qū)、HEAD、工作區(qū)
2、git add到底做了什么?
3、git commit到底做了什么?
1、理解幾個(gè)概念:git倉(cāng)庫(kù)(版本庫(kù))、工作區(qū)、暫存區(qū)、HEAD

(1) git倉(cāng)庫(kù)(版本庫(kù)):git倉(cāng)庫(kù)就是一個(gè).git文件夾。這個(gè)文件夾內(nèi)包含了很多文件(見插圖2),其中有一個(gè)很重要的文件夾objects,保存了暫存區(qū)的所有文件對(duì)象,包括blob對(duì)象、tree對(duì)象、commit對(duì)象等,這些對(duì)象都是一以文件的形式來(lái)保存的。還有HEAD文件,保存著最新的提交的指針。當(dāng)然很多人到這里可能還是不理解objects中的文件對(duì)象和HEAD中保存的指針到底是什么意思,沒關(guān)系,下面會(huì)詳細(xì)講解。
(2)工作區(qū):在一個(gè)項(xiàng)目目錄中,除了.git文件的其他所有文件的集合就是工作區(qū)。
(3)暫存區(qū):暫存區(qū)可以理解為文件從修改到最后提交到git版本庫(kù)之間的一個(gè)緩存,為了防止一次提交了不必要的文件,有回退的余地,便有了暫存區(qū)。
(4)HEAD:HEAD在.git文件夾中是一個(gè)文件,文件的內(nèi)容是一個(gè)32位的16進(jìn)制數(shù),這只是一個(gè)指針,他指向最近一個(gè)提交點(diǎn)、這個(gè)提交點(diǎn)實(shí)質(zhì)是一個(gè)commit對(duì)象,對(duì)象里包含里多個(gè)屬性,包括最后一個(gè)提交點(diǎn)目錄結(jié)構(gòu)索引、上一次提交點(diǎn)id、提交人、提交時(shí)間等。
2、git add到底做了什么?
(1) 首先,跟著我的思路,我們來(lái)創(chuàng)建一個(gè)git倉(cāng)庫(kù), 通過一個(gè)例子來(lái)理解git add命令
1、首先,我們通過git init來(lái)創(chuàng)建一個(gè)倉(cāng)庫(kù),這時(shí)會(huì)生成一個(gè).git文件夾,這個(gè)文件夾就一個(gè)git倉(cāng)庫(kù)
2、創(chuàng)建一個(gè)文件A.java
執(zhí)行 git add A.java
到.git里面的objects文件中,發(fā)現(xiàn),多了一個(gè)文件夾,打開,里面有一個(gè)文件,名字是一串符號(hào),打開這個(gè)文件,里面是一串無(wú)法識(shí)別的字符。
git add做了啥?
其實(shí),在執(zhí)行g(shù)it add命令的時(shí)候,git首先會(huì)通過hash函數(shù)算出文件名A.java對(duì)應(yīng)的sha-1值是1fed2a34f13dd2a34f13d,這個(gè)code是一個(gè)32位的16進(jìn)制數(shù),git會(huì)取這個(gè)code的前兩位作為文件夾名在.git/objects文件夾中創(chuàng)建一個(gè)文件夾1f,取code的后30位作為文件名,在.git/objects/1f中創(chuàng)建一個(gè)文件ed2a34f13dd2a34f13d,git會(huì)將A.java的文件內(nèi)容通過一定的壓縮保存在這個(gè)文件中
未完待續(xù).....
本文到這里就快結(jié)束了,文中可能有些地方?jīng)]有說(shuō)明清楚,歡迎指定討論,有問題歡迎騷擾,看到會(huì)第一時(shí)間回復(fù)!