通常在很多传统集中式版本控制系统中,只有两个空间用来管理你的数据,一个是你的working copy(工作区),另一个便是 datastore(版本库),然而在Git中,引入了staging area(index)这一概念,我们可以把它看做一个“码头”,你来决定其中的哪些改变可以被“运走”。
有了暂存区,我们的工作区边和Git库就不再直接挂钩了,这样我们可以更加灵活的控制我们的数据了,对暂存区的操作非常的简单,git add可以将你工作区的文件添加到暂存区中,git commit 可以将暂存区中的文件提交到版本库中。
举个例子吧:
$ git status
On branch master
Changed but not updated:
(use "git add <file>..." to update what will be committed)
modified: README.md
modified: about.html
Untracked files:
(use "git add <file>..." 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 <file>..." 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 diff 不加参数,比较的是工作区和暂存区的数据。
git diff --cached 比较的是暂存区和版本库中的数据
git diff HEAD/master 比较的是版本库和工作区的数据
这里只是大致的说明了下暂存区的一点点理解,至于暂存区给我们带来的好处和强大还有很多,让我们慢慢解开Git的面纱。
注:图片来自 机械工业出版社 蒋鑫著《Git权威指南》一书。