本篇爲git學習筆記的第二篇文章。
一、工作區與暫存區
在Git中暫存區(stage或者index)是重要的概念之一。我們工作的目錄稱爲工作區,還有一個.git隱藏目錄稱爲版本庫,裏面包含暫存區和各個分支。其中存在一個指向當前分支的指針HEAD。
關係如圖所示:
如上圖所示,當我們使用git add命令時,我們就將工作區的變動添加到暫存區,當使用git commit命令時就將暫存區的變動提交到了當前分支。
瞭解工作區、暫存區概念便於我們理解許多git命令,下面就學習一些與工作區和暫存區有關的命令。
二、與工作區和暫存區相關的命令
- git diff 比較文件差異
$ git diff #比較工作區和暫存區差異
$ git diff HEAD #比較HEAD和工作區差異
$ git diff --cached #比較暫存區和HEAD差異
驗證:新建一個文件diffTest.txt,在文件中寫入一個單詞one,然後執行git add,接着執行git commit提交到版本庫。
然後再在文件第二行寫入單詞two,保存。執行命令git diff
git提示文件發生變化,多了一行two。這時執行命令git add,將變動後的文件添加到暫存區。再次執行git diff
發現git沒有提示任何內容,這是因爲git diff比較的是工作區和暫存的文件。我們已經將變動後的文件添加到了暫存區,這時工作區和暫存區的文件是一致的。
執行命令git diff –cached對比暫存區和HEAD中文件差異,結果如下:
接着我們在文件第三行寫入單詞three。執行命令git diff HEAD,結果如下:
git提示有兩行存在差異,這也證明了git diff HEAD對比的是工作區和HEAD中文件差異。
- 撤銷文件修改
$ git checkout -- filename #暫存區覆蓋工作區
$ git reset HEAD #HEAD覆蓋暫存區
$ git checkout HEAD #HEAD同時覆蓋工作區和暫存區
接着剛剛的操作。此時diffTest.txt文件在工作區、暫存區和HEAD中都是不同的,分別爲one two three、one two、one。
使用命令git checkout – filename用暫存區文件覆蓋工作區文件,並查看文件內容,結果如下:
可以看到工作區中文件內容已經變成了one two,文件內容被暫存區覆蓋。
接着執行命令git reset HEAD,用HEAD文件覆蓋暫存區文件,並查看暫存區和HEAD文件差異,結果如下:
可以看暫存區中文件內容被覆蓋爲one。
最後我們執行git checkout HEAD,用HEAD中文件同時覆蓋工作區和暫存區,結果如下:
可以看到這時,工作區、暫存區和HEAD中文件內容保持一致。
- git rm刪除文件
$ git rm filename #同時刪除工作區和暫存區文件
$ git rm --cached #只刪除暫存區文件
$ rm #只刪除工作區文件
驗證:
新增文件rmTest.txt,並通過git status查看工作區狀態,如下如所示:
可以看到rmTest.txt 爲untracked新增文件狀態,執行git add將rmTest.txt添加到暫存區,再次通過git status查看狀態,接着執行git rm –cached,最後再次執行git status查看狀態,發現rmTest.txt又恢復到untracked新增文件狀態,說明git rm –cached將暫存區中文件刪除了。