git干貨系列:(二)深入學(xué)習(xí)之前先理解git暫存區(qū)

前言


暫存區(qū)(stage, index)Git最重要的概念之一,理解了這個(gè)概念很多 Git 命令就不再那么神秘了名秀。下面幾個(gè)驗(yàn)證例子一開始看不懂沒關(guān)系励负,工作區(qū)、版本庫(kù)中的暫存區(qū)和版本庫(kù)之間的關(guān)系圖先理解先匕得。

正文


下面這個(gè)圖展示了工作區(qū)继榆、版本庫(kù)中的暫存區(qū)和版本庫(kù)之間的關(guān)系。


在這個(gè)圖中汁掠,我們可以看到部分 Git命令是如何影響工作區(qū)和暫存區(qū)(stage, index)的略吨。

  • 圖中左側(cè)為工作區(qū),右側(cè)為版本庫(kù)考阱。在版本庫(kù)中標(biāo)記為 index 的區(qū)域是暫存區(qū)(stage, index)翠忠,標(biāo)記為 master 的是 master 分支所代表的目錄樹。
  • 圖中我們可以看出此時(shí)HEAD實(shí)際是指向master分支的一個(gè)“游標(biāo)”乞榨。所以圖示的命令中出現(xiàn)HEAD的地方可以用master來(lái)替換秽之。
  • 圖中的objects標(biāo)識(shí)的區(qū)域?yàn)?code>Git的對(duì)象庫(kù)当娱,實(shí)際位于.git/objects目錄下,我們會(huì)在后面的章節(jié)重點(diǎn)介紹政溃。
  • 當(dāng)對(duì)工作區(qū)修改(或新增)的文件執(zhí)行git add命令時(shí)趾访,暫存區(qū)的目錄樹被更新,同時(shí)工作區(qū)修改(或新增)的文件內(nèi)容被寫入到對(duì)象庫(kù)中的一個(gè)新的對(duì)象中董虱,而該對(duì)象的ID 被記錄在暫存區(qū)的文件索引中扼鞋。
  • 當(dāng)執(zhí)行提交操作(git commit)時(shí),暫存區(qū)的目錄樹寫到版本庫(kù)(對(duì)象庫(kù))中愤诱,master分支會(huì)做相應(yīng)的更新云头。即master指向的目錄樹就是提交時(shí)暫存區(qū)的目錄樹。
  • 當(dāng)執(zhí)行 git reset HEAD 命令時(shí)淫半,暫存區(qū)的目錄樹會(huì)被重寫溃槐,被 master 分支指向的目錄樹所替換,但是工作區(qū)不受影響科吭。
  • 當(dāng)執(zhí)行 git checkout . 或者 git checkout -- [file] 命令時(shí)昏滴,會(huì)用暫存區(qū)全部或指定的文件替換工作區(qū)的文件。這個(gè)操作很危險(xiǎn)对人,會(huì)清除工作區(qū)中未添加到暫存區(qū)的改動(dòng)谣殊。
  • 當(dāng)執(zhí)行 git checkout HEAD . 或者 git checkout HEAD [file] 命令時(shí),會(huì)用 HEAD 指向的 master 分支中的全部或者部分文件替換暫存區(qū)和以及工作區(qū)中的文件牺弄。這個(gè)命令也是極具危險(xiǎn)性的姻几,因?yàn)椴坏珪?huì)清除工作區(qū)中未提交的改動(dòng),也會(huì)清除暫存區(qū)中未提交的改 動(dòng)势告。
  • 當(dāng)執(zhí)行 git rm --cached [file]命令時(shí)蛇捌,會(huì)直接從暫存區(qū)刪除文件,工作區(qū)則不做出改變咱台。
  • 當(dāng)執(zhí)行 git rm file命令時(shí)络拌,會(huì)同時(shí)刪除暫存區(qū)和工作區(qū)的文件。
  • 當(dāng)執(zhí)行 rm file命令時(shí)回溺,只會(huì)刪除工作區(qū)的文件盒音。

下面舉例子來(lái)證明以上觀點(diǎn)


假設(shè):
工作區(qū):a
暫存區(qū)(index):b
HEAD:C

git diff命令結(jié)論

git diff           比較a跟b
git diff --cached  比較b跟c
git diff HEAD      比較a跟c

git reset跟 git checkout結(jié)論

git reset HEAD              c覆蓋b
git checkout -- <file>      b覆蓋a
git checkout HEAD <file>    c覆蓋a,b

git rm命令結(jié)論

 git rm          刪除a跟b
 git rm --cached 只刪除b
 rm file         只刪除a

證明git diff結(jié)論


例子,默認(rèn)新建一個(gè)readme.txt馅而,里面輸入內(nèi)容one然后add并且commit一次。

1:修改readme.txt譬圣,新增內(nèi)容two瓮恭,這時(shí)候a內(nèi)容改變了,多了two,而b跟c內(nèi)容不變厘熟,都只有one屯蹦。
執(zhí)行git diff readme.txt查看效果

結(jié)論:如圖看出维哈,內(nèi)容有修改, a跟b比較了


執(zhí)行git diff --cached readme.txt查看效果

結(jié)論:如圖看出登澜,沒有變化阔挠,因?yàn)閎跟c內(nèi)容一樣。


執(zhí)行git diff HEAD readme.txt查看效果

如圖所示:內(nèi)容有修改脑蠕,a跟c比較了


2.這時(shí)候執(zhí)行git add readme.txt,這時(shí)候a购撼,b內(nèi)容都多了two,而c內(nèi)容不變谴仙,只有one
執(zhí)行git diff readme.txt查看效果

結(jié)論:如圖看出迂求,沒有變化, 因?yàn)閍跟b內(nèi)容一樣。


執(zhí)行g(shù)it diff --cached readme.txt查看效果

結(jié)論:如圖看出,內(nèi)容有修改珍特,b跟c比較了


執(zhí)行git diff HEAD readme.txt查看效果

結(jié)論:如圖看出差油,內(nèi)容有修改,a跟c比較了

3.最后使用git commit提交一次奶陈,這時(shí)候a,b,c內(nèi)容都一樣,都包含two

結(jié)論驰怎,如圖看出,沒有變化春霍,說明a,b,c內(nèi)容一樣


根據(jù)上面的實(shí)例再一次證明了如下觀點(diǎn):

git diff           比較工作區(qū)跟暫存區(qū)
git diff --cached  比較暫存區(qū)跟HEAD
git diff HEAD      比較工作區(qū)跟HEAD

證明git reset跟 git checkout結(jié)論


例子砸西,默認(rèn)新建一個(gè)readme.txt,里面輸入內(nèi)容one然后add并且commit一次址儒,這時(shí)候a,b,c內(nèi)容都是one


1.修改readme.txt芹枷,新增內(nèi)容two,執(zhí)行git add readme.txt操作莲趣,這時(shí)候a ,b內(nèi)容都多了two,c還是只有one.
執(zhí)行git reset HEAD -- readme.txt命令后鸳慈,c覆蓋b,這時(shí)候b內(nèi)容也變成只有one了,使用git diff readme.txt命令可以看到喧伞,有內(nèi)容修改走芋,a跟b內(nèi)容不一樣。


2.此時(shí)a內(nèi)容有two,b和c都只有one潘鲫,執(zhí)行git checkout -- readme.txt后翁逞,b覆蓋a,此時(shí)a,b,c都是one。執(zhí)行git diff readme.txt命令可以看到溉仑,沒有改變挖函。


3.此時(shí)a,b,c都只有one,修改一下浊竟,添加內(nèi)容two怨喘,執(zhí)行git add readme.txtgit commit -m "two".再修改一次readme.txt,添加內(nèi)容three,然后會(huì)執(zhí)行git add readme.txt津畸,此時(shí)a跟b都包含three,而c只包含one跟two必怜。執(zhí)行git checkout HEAD readme.txt后肉拓,c覆蓋a和b,a,b里面內(nèi)容都只有one跟two。分別使用命令git diff --cachedgit diff HEAD來(lái)查看b跟c梳庆,a跟c的比對(duì)暖途,發(fā)現(xiàn)都一樣。


根據(jù)上面的實(shí)例再一次證明了如下觀點(diǎn):

git reset HEAD              HEAD覆蓋暫存區(qū)
git checkout -- <file>      暫存區(qū)覆蓋工作區(qū)
git checkout HEAD <file>    HEAD覆蓋暫存區(qū)和工作區(qū)

證明git rm 結(jié)論


默認(rèn)新建一個(gè)readme.txt靠益,里面輸入內(nèi)容one丧肴,然后使用git add readme.txt命令。
1.執(zhí)行g(shù)it rm readme.txt命令胧后,發(fā)現(xiàn)文件被刪除了芋浮。

2.再新建一個(gè)一個(gè)readme.txt,里面輸入內(nèi)容 one壳快,然后使用git add readme.txt命令纸巷。執(zhí)行git rm --cached readme.txt命令,發(fā)現(xiàn)文件內(nèi)readme.txt還在眶痰,然后執(zhí)行git status命令瘤旨,發(fā)現(xiàn)是Untracked狀態(tài),也就是未add竖伯,這就說明暫存區(qū)被刪除了存哲。


根據(jù)上面的實(shí)例再一次證明了如下觀點(diǎn):

 git rm file      會(huì)將文件從緩存區(qū)和你的硬盤中(工作區(qū))刪除
 git rm --cached  只刪除暫存區(qū),不刪除工作區(qū)
 rm file          只刪除工作區(qū)

總結(jié)


暫存區(qū)的原理需要大家重復(fù)的加深了解七婴,基礎(chǔ)打牢了后面學(xué)起來(lái)就輕松很多祟偷,上面幾個(gè)例子都自己驗(yàn)證一遍,加深印象打厘。


一直覺得自己寫的不是技術(shù)修肠,而是情懷,一篇篇文章是自己這一路走來(lái)的痕跡户盯∏妒靠專業(yè)技能的成功是最具可復(fù)制性的,希望我的這條路能讓你少走彎路莽鸭,希望我能幫你抹去知識(shí)的蒙塵吗伤,希望我能幫你理清知識(shí)的脈絡(luò),希望未來(lái)技術(shù)之巔上有你也有我硫眨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末足淆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缸浦,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氮兵,死亡現(xiàn)場(chǎng)離奇詭異裂逐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)泣栈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門卜高,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人南片,你說我怎么就攤上這事掺涛。” “怎么了疼进?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵薪缆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我伞广,道長(zhǎng)拣帽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任嚼锄,我火速辦了婚禮减拭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘区丑。我一直安慰自己拧粪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布沧侥。 她就那樣靜靜地躺著可霎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪正什。 梳的紋絲不亂的頭發(fā)上啥纸,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音婴氮,去河邊找鬼斯棒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛主经,可吹牛的內(nèi)容都是我干的荣暮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼罩驻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼穗酥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤砾跃,失蹤者是張志新(化名)和其女友劉穎骏啰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抽高,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡判耕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了翘骂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壁熄。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碳竟,靈堂內(nèi)的尸體忽然破棺而出草丧,到底是詐尸還是另有隱情,我是刑警寧澤莹桅,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布昌执,位于F島的核電站,受9級(jí)特大地震影響统翩,放射性物質(zhì)發(fā)生泄漏仙蚜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一厂汗、第九天 我趴在偏房一處隱蔽的房頂上張望委粉。 院中可真熱鬧,春花似錦娶桦、人聲如沸贾节。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栗涂。三九已至,卻和暖如春祈争,著一層夾襖步出監(jiān)牢的瞬間斤程,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工菩混, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忿墅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓沮峡,卻偏偏與公主長(zhǎng)得像疚脐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邢疙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 前言 暫存區(qū)(stage, index)是Git最重要的概念之一棍弄,理解了這個(gè)概念很多Git命令就不再那么神秘了望薄。下...
    請(qǐng)叫我周小帥閱讀 411評(píng)論 0 1
  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,649評(píng)論 4 54
  • 〈一〉 窮秋霧烽黯 原野鴻飛處 意凄和漸離 罷歡悵何許 瀚汉艋空搖綠 流霰靜如練 林壑收夕霏 云霞迭映蔚 千念盈感昏...
    蕙清閱讀 208評(píng)論 14 6
  • 總以為離開了家的我會(huì)像脫了韁的野馬一樣瘋狂痕支,會(huì)覺得離開了爸爸媽媽的嘮叨會(huì)很開心,相反蛮原,上了大學(xué)采转,離開了家,才...
    一米陽(yáng)光_4175閱讀 433評(píng)論 0 3
  • 有人說:人生最愜意的事是自由板熊,但并不意味著:你不需要花費(fèi)時(shí)間框全、盡心盡力和付出承諾。當(dāng)你要學(xué)習(xí)重要的人生技能時(shí)干签,當(dāng)然...
    coolspider2015閱讀 1,321評(píng)論 4 23