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