Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念,本文主要的目的就是给大家介绍清楚什么是暂存区.

一、工作区

Working Directory其实就是个文件夹。GitRepository1文件夹就是个工作区。

Git教程2(工作区和暂存区)_git

二、版本库

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

Git教程2(工作区和暂存区)_暂存区_02

三、案例演示

修改read.txt文件,添加一行信息

hello git
hello git 2
hello git 3
hello git 4

新添加一个文件listener.txt

Git教程2(工作区和暂存区)_工作区_03

查看状态

Git教程2(工作区和暂存区)_git_04
此时的结构图为:
Git教程2(工作区和暂存区)_暂存区_05

执行add命令

Git教程2(工作区和暂存区)_暂存区_06Git教程2(工作区和暂存区)_git_07
此时的结构图为:
Git教程2(工作区和暂存区)_暂存区_08

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

执行commit操作

Git教程2(工作区和暂存区)_git_09一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:
Git教程2(工作区和暂存区)_工作区_10此时的结构图为:commit后暂存区就没有任何东西了
Git教程2(工作区和暂存区)_暂存区_11

四、管理修改案例

为了进一步理解暂存区和工作区,我们通过具体例子我们来演示下

对read.txt文件进行修改

Git教程2(工作区和暂存区)_git_12

执行add操作

Git教程2(工作区和暂存区)_git_13

第二次对文件进行修改

Git教程2(工作区和暂存区)_工作区_14

执行commit操作

Git教程2(工作区和暂存区)_暂存区_15

执行status操作

Git教程2(工作区和暂存区)_git_16

我们发现commit操作并没有将我们第二次修改的记录提交,因为我们只对第一次修改的记录执行了add操作,将这次修改的操作提交到了暂存区,第二次修改的信息还是在工作区,而commit操作只能将暂存区的数据提交,查看工作区和版本库中最新版本的区别通过 git diff HEAD – read.txt

Git教程2(工作区和暂存区)_工作区_17

那怎么提交第二次修改呢?你可以继续git add再git commit,也可以别着急提交第一次修改,先git add第二次修改,再git commit,就相当于把两次修改合并后一块提交了,

五、撤销管理

我们在开发过程中难免会出现bug,有代码需要撤销。这节就介绍撤销的几种场景。

未提交到暂存区

修改内容

Git教程2(工作区和暂存区)_git_18

撤销

撤销命令 git checkout – file

Git教程2(工作区和暂存区)_暂存区_19注意 update2也被撤销了,因为上个案例中update2也是被添加后没有执行add操作,所以一并也被撤销了。

提交到暂存区

有时我们会将数据提交到暂存区后才发现有问题,需要撤销,我们来看看怎么办

Git教程2(工作区和暂存区)_git_20Git教程2(工作区和暂存区)_暂存区_21

git 提示告诉我们可以通过 git reset HEAD file撤销命令
Git教程2(工作区和暂存区)_工作区_22
将修改从暂存区回退到工作区

Git教程2(工作区和暂存区)_暂存区_23

回退到工作区我们就可以通过 git checkout – read.txt撤销

Git教程2(工作区和暂存区)_暂存区_24

commit后

如果是内容已经被提交到了最新版本库中,但并没有提交到远程库中,则我们可以通过版本回退的方式撤销。

Git教程2(工作区和暂存区)_暂存区_25

版本回退

Git教程2(工作区和暂存区)_git_26

六、删除管理

删除文件并版本库中删除

Git教程2(工作区和暂存区)_工作区_27Git教程2(工作区和暂存区)_git_28

删除文件并从版本库找回

Git教程2(工作区和暂存区)_git_29

命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。

总结

工作区(Working Directory)
是我们直接编辑的地方,例如eclipse打开的项目,记事本打开的文本等,肉眼可见,直接操作。
暂存区(Stage 或 Index)
数据暂时存放的区域,可在工作区和版本库之间进行数据的友好交流。
版本库(commit History)
存放已经提交的数据,push 的时候,就是把这个区的数据 push 到远程仓库了。