git中暫存區(qū)和本地庫(kù)的區(qū)別:暫存區(qū)又稱索引區(qū),是工作區(qū)與本地倉(cāng)庫(kù)之間的一個(gè)過(guò)渡區(qū)域,它記錄了工作區(qū)的代碼狀態(tài)(有無(wú)改動(dòng),或者做了哪些改動(dòng));而本地倉(cāng)庫(kù)則記錄了本地代碼的狀態(tài)。
本教程操作環(huán)境:Windows7系統(tǒng)、Git2.30.0版、Dell G3電腦。
1、git倉(cāng)庫(kù)相關(guān)概念的理解
要想深入理解git命令,必須理解git倉(cāng)庫(kù)相關(guān)的幾個(gè)概念。先看一下一份本地代碼目錄D:gittest目錄下:
需要注意的是.git是隱藏目錄,需要顯示隱藏文件才能看到。
工作區(qū)(working directory):簡(jiǎn)單來(lái)說(shuō)保存在本地的文件或目錄都屬于工作區(qū),平常修改代碼都是在工作區(qū)進(jìn)行的。一般本地的文件,除了隱藏的.git目錄,其它都屬于工作區(qū)。上圖中看到的mydir、file1.txt、file2.txt都是屬于工作區(qū)。
暫存區(qū)(Stage):又稱索引區(qū)(index),顧名思義,它是工作區(qū)與本地倉(cāng)庫(kù)之間的一個(gè)過(guò)渡,它記錄了工作區(qū)的代碼狀態(tài)(有無(wú)改動(dòng),或者作了哪些改動(dòng))。位于.git目錄中。
本地倉(cāng)庫(kù)(repository):記錄了本地代碼的狀態(tài),位于.git目錄中。
關(guān)于狀態(tài)的理解:
想一下,我們平時(shí)在修改一份重要的文件時(shí),肯定要先做一份備份,目的是防止修改出錯(cuò),最終還能恢復(fù)。假如這份文件本身很大,如果如果備份就會(huì)占用額外較多的空間,這樣就顯得不太劃算。還有另外一種方式,就是記錄文件的修改狀態(tài),而不是對(duì)文件本身進(jìn)行備份。文件狀態(tài)類(lèi)似如下描述:
文件第一行:將xxx換成了****
文件第三行和第四行之間,增加了一行,內(nèi)容是……
說(shuō)白了文件狀態(tài)就是文件的修改記錄,根據(jù)修改記錄我們就可以知道我們對(duì)文件作了哪些修改,根據(jù)修改記錄也可以恢復(fù)到文件修改之前的狀態(tài)。
2、git命令講解
幾個(gè)與查看狀態(tài)相關(guān)的命令:
git status 查看文件在工作區(qū)、暫存區(qū)、本地倉(cāng)庫(kù)之間的變化
git diff 查看工作區(qū)與暫存區(qū)的差異
git diff –cached 查看暫存區(qū)與本地倉(cāng)庫(kù)的區(qū)別
git diff HEAD 查看工作區(qū)與本地倉(cāng)庫(kù)之間的差異
一些命令對(duì)應(yīng)的操作如下:
下面以一個(gè)具體的例子來(lái)說(shuō)明本地文件修改會(huì)導(dǎo)致相關(guān)區(qū)域的變化
修改之前,工作區(qū)、暫存區(qū)與本地倉(cāng)庫(kù)之間狀態(tài)是一致的
(1)本地修改文件file1.txt 里面增加一行add this line
git status 查看文件在工作區(qū)、暫存區(qū)、本地倉(cāng)庫(kù)倉(cāng)庫(kù)之間的變化
上圖中可以看到,Changes not staged for commit:,說(shuō)明文件在工作區(qū)已經(jīng)發(fā)生了變化,但是修改還未提交到暫存區(qū)
git diff 查看工作區(qū)與暫存區(qū)的變化
從圖中可以看出,工作區(qū)與暫存區(qū)之間發(fā)生了變化,這是由于本地文件修改了,并且還未將修改提交到暫存區(qū)
git diff HEAD 查看工作區(qū)與本地倉(cāng)庫(kù)之間的狀態(tài)
從上圖可以看出,工作區(qū)與本地倉(cāng)庫(kù)之間也出現(xiàn)了差異。很簡(jiǎn)單,此時(shí)本地倉(cāng)庫(kù)與暫存區(qū)的狀態(tài)是一致的
git diff –cached 查看暫存區(qū)與本地倉(cāng)庫(kù),會(huì)發(fā)現(xiàn)它們之間缺失沒(méi)有差異
(2)將本地修改提交到暫存區(qū)
git add . 將本地的修改提交的暫存區(qū)
git status
可以看到,修改已經(jīng)提交到了暫存區(qū):Changes to be committed:
提交之后,用git diff 查看,會(huì)發(fā)現(xiàn)工作區(qū)與暫存區(qū)已經(jīng)沒(méi)有了差異。
但是暫存區(qū)與工作區(qū)有了差異。
git diff –cached
同樣,用git diff HEAD會(huì)發(fā)現(xiàn)工作區(qū)與本地倉(cāng)庫(kù)還是有差異
(3)將修改提交到本地倉(cāng)庫(kù)
git commit -m “add a line in file1.txt” 將修改從暫存區(qū)提交到本地倉(cāng)庫(kù)
git status查看,提示Your branch is ahead of ‘origin/master’ by 1 commit.表明工作區(qū)的修改已經(jīng)提交的本地倉(cāng)庫(kù),但是還沒(méi)有推送到遠(yuǎn)程分支。
git diff、git diff –cached 、git diff HEAD 會(huì)發(fā)現(xiàn)提示沒(méi)有差異。因?yàn)楣ぷ鲄^(qū)的修改已經(jīng)提交到本地倉(cāng)庫(kù),此時(shí)工作區(qū)、暫存區(qū)、本地倉(cāng)庫(kù)的狀態(tài)是一致的。
逆操作
git add – git checkout 將工作區(qū)文件退回到暫存區(qū)狀態(tài),將工作區(qū)文件替換為暫存區(qū)文件。
比如工作區(qū)修改了文件file1.txt,此時(shí)還未提交到暫存區(qū)。如果想放棄修改,就可以用
git checkout file1.txt將文件退回到暫存區(qū)狀態(tài)(放棄修改)
git commit – git reset HEAD 拉取最近一次提交到本地倉(cāng)庫(kù)的文件到暫存區(qū),不影響工作區(qū)。
總結(jié):
如果我們想放棄本地文件(工作區(qū))的某一次修改:
- 如果修改還未提交到暫存區(qū),就可以使用git checkcout恢復(fù)
- 如果修改已經(jīng)提交到暫存區(qū),還沒(méi)提交到本地倉(cāng)庫(kù),就先使用git reset HEAD 將暫存區(qū)狀態(tài)恢復(fù),然后使用git checkout 恢復(fù)工作區(qū)
推薦學(xué)習(xí):《Git教程》