通常在很多传统集中式版本控制系统中,只有两个空间用来管理你的数据,一个是你的working copy(工作区),另一个便是 datastore(版本库),然而在Git中,引入了staging area(index)这一概念,我们可以把它看做一个“码头”,你来决定其中的哪些改变可以被“运走”。
有了暂存区,我们的工作区边和Git库就不再直接挂钩了,这样我们可以更加灵活的控制我们的数据了,对暂存区的操作非常的简单,git add可以将你工作区的文件添加到暂存区中,git commit 可以将暂存区中的文件提交到版本库中。
举个例子吧:
- $ git status
-
- On branch master
-
- Changed but not updated:
-
- (use "git add
..." to update what will be committed) -
-
-
- modified: README.md
-
- modified: about.html
-
-
-
- Untracked files:
-
- (use "git add
..." to include in what will be committed) -
-
-
- help.txt
-
- no changes added to commit (use "git add" and/or "git commit -a")
我们修改了README.md 和about.html两个文件,并且添加了help.txt文件,当执行git status命令时,git告诉我们可以执行git add命令将修改添加到暂存区中。
- $ git add .
-
- $ git status
-
- On branch master
-
- Changes to be committed:
-
- (use "git reset HEAD
..." to unstage) -
-
-
- modified: README.md
-
- modified: about.html
-
- new file: help.txt
当我们执行git add . 后,再执行git status, git又提示我们可以执行git reset HEAD
- $ git commit -m "Adding stuff"
-
- Created commit e793200: Adding stuff
-
- 2 files changed, 3 insertions(+), 0 deletions(-)
-
- create mode 100644 help.txt
这样我们就将暂存区中的数据提交到了版本库中,Git告诉我们有两个文件被修改了,插入了三行数据,添加了一个文件。
以上便是最基本的Git操作了,那到底什么是暂存区呢?我们来看个图片可能更直观

我们看到图片大致分成了三个区域:工作区,index,master。目前我们便可以把它们分别理解为工作区,暂存区,和版本库了。
可以看到add 操作将工作区数据添加到了暂存区,commit操作则提交到了版本库中,而reset HEAD是用版本库中最新提交的目录树来重置暂存区的目录树。

另外在我们执行git diff操作时后面添加不同的参数,会得到不同的结果,这是因为比较的两个对象可能不相同,如:
这里只是大致的说明了下暂存区的一点点理解,至于暂存区给我们带来的好处和强大还有很多,让我们慢慢解开Git的面纱。