git中暫存區和本地庫的區別:暫存區又稱索引區,是工作區與本地倉庫之間的一個過渡區域,它記錄了工作區的代碼狀態(有無改動,或者做了哪些改動);而本地倉庫則記錄了本地代碼的狀態。

本教程操作環境:Windows7系統、Git2.30.0版、Dell G3電腦。
1、git倉庫相關概念的理解
要想深入理解git命令,必須理解git倉庫相關的幾個概念。先看一下一份本地代碼目錄D:gittest目錄下:

需要注意的是.git是隱藏目錄,需要顯示隱藏文件才能看到。
工作區(working directory):簡單來說保存在本地的文件或目錄都屬于工作區,平常修改代碼都是在工作區進行的。一般本地的文件,除了隱藏的.git目錄,其它都屬于工作區。上圖中看到的mydir、file1.txt、file2.txt都是屬于工作區。
暫存區(Stage):又稱索引區(index),顧名思義,它是工作區與本地倉庫之間的一個過渡,它記錄了工作區的代碼狀態(有無改動,或者作了哪些改動)。位于.git目錄中。
本地倉庫(repository):記錄了本地代碼的狀態,位于.git目錄中。
關于狀態的理解:
想一下,我們平時在修改一份重要的文件時,肯定要先做一份備份,目的是防止修改出錯,最終還能恢復。假如這份文件本身很大,如果如果備份就會占用額外較多的空間,這樣就顯得不太劃算。還有另外一種方式,就是記錄文件的修改狀態,而不是對文件本身進行備份。文件狀態類似如下描述:
文件第一行:將xxx換成了****
文件第三行和第四行之間,增加了一行,內容是……
說白了文件狀態就是文件的修改記錄,根據修改記錄我們就可以知道我們對文件作了哪些修改,根據修改記錄也可以恢復到文件修改之前的狀態。
2、git命令講解
幾個與查看狀態相關的命令:
git status 查看文件在工作區、暫存區、本地倉庫之間的變化
git diff 查看工作區與暫存區的差異
git diff –cached 查看暫存區與本地倉庫的區別
git diff HEAD 查看工作區與本地倉庫之間的差異
一些命令對應的操作如下:
下面以一個具體的例子來說明本地文件修改會導致相關區域的變化
修改之前,工作區、暫存區與本地倉庫之間狀態是一致的
(1)本地修改文件file1.txt 里面增加一行add this line
git status 查看文件在工作區、暫存區、本地倉庫倉庫之間的變化

上圖中可以看到,Changes not staged for commit:,說明文件在工作區已經發生了變化,但是修改還未提交到暫存區
git diff 查看工作區與暫存區的變化

從圖中可以看出,工作區與暫存區之間發生了變化,這是由于本地文件修改了,并且還未將修改提交到暫存區
git diff HEAD 查看工作區與本地倉庫之間的狀態

從上圖可以看出,工作區與本地倉庫之間也出現了差異。很簡單,此時本地倉庫與暫存區的狀態是一致的
git diff –cached 查看暫存區與本地倉庫,會發現它們之間缺失沒有差異
(2)將本地修改提交到暫存區
git add . 將本地的修改提交的暫存區
git status

可以看到,修改已經提交到了暫存區:Changes to be committed:
提交之后,用git diff 查看,會發現工作區與暫存區已經沒有了差異。
但是暫存區與工作區有了差異。
git diff –cached

同樣,用git diff HEAD會發現工作區與本地倉庫還是有差異
(3)將修改提交到本地倉庫
git commit -m “add a line in file1.txt” 將修改從暫存區提交到本地倉庫
git status查看,提示Your branch is ahead of ‘origin/master’ by 1 commit.表明工作區的修改已經提交的本地倉庫,但是還沒有推送到遠程分支。

git diff、git diff –cached 、git diff HEAD 會發現提示沒有差異。因為工作區的修改已經提交到本地倉庫,此時工作區、暫存區、本地倉庫的狀態是一致的。
逆操作
git add – git checkout 將工作區文件退回到暫存區狀態,將工作區文件替換為暫存區文件。
比如工作區修改了文件file1.txt,此時還未提交到暫存區。如果想放棄修改,就可以用
git checkout file1.txt將文件退回到暫存區狀態(放棄修改)
git commit – git reset HEAD 拉取最近一次提交到本地倉庫的文件到暫存區,不影響工作區。
總結:
如果我們想放棄本地文件(工作區)的某一次修改:
- 如果修改還未提交到暫存區,就可以使用git checkcout恢復
- 如果修改已經提交到暫存區,還沒提交到本地倉庫,就先使用git reset HEAD 將暫存區狀態恢復,然后使用git checkout 恢復工作區
推薦學習:《Git教程》
站長資訊網