本篇为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将暂存区中文件删除了。