当前工作目录中的文件就是工作区,在工作区里有文件变化,可以通过 git status 查看状态:
wangbo@wangbo-VirtualBox:~/test/git-demo$ touch main.c
wangbo@wangbo-VirtualBox:~/test/git-demo$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
main.c
nothing added to commit but untracked files present (use "git add" to track)
通过 git add 后文件就被放到了暂存区,暂存的意思就是等待最终的提交,也就是打入版本库。
wangbo@wangbo-VirtualBox:~/test/git-demo$ git add main.c
wangbo@wangbo-VirtualBox:~/test/git-demo$ git status -s
A main.c
wangbo@wangbo-VirtualBox:~/test/git-demo$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: main.c
如果在最终提交之前,希望了解一下暂存区和最后一次本地版本库的内容区别,输入 git diff --cached 后:

--cached 表示暂存区,事实这个这个命令是一个简写,完整的写法是 git diff --cached HEAD,比较暂存区和 HEAD(最后一次提交的版本库) 之间的区别,由于 HEAD 是默认参数,被省略了。
同样的如果我们修改了一个已经被跟踪的文件,输入 git diff HEAD 就可以比较工作区和最后一次版本库的区别,可以简写为 git diff 命令:

把这两个文件都提交以后,它们就进入了版本库 HEAD,提交之前先查看一下 .git 这个目录的存储大小。
wangbo@wangbo-VirtualBox:~/test/git-demo$ du -sh .git
304K .git
提交之后比较一下:
wangbo@wangbo-VirtualBox:~/test/git-demo$ git add .
wangbo@wangbo-VirtualBox:~/test/git-demo$ git commit -m 'make some changes'
[master 8ef4571] make some changes
2 files changed, 4 insertions(+)
create mode 100644 main.c
wangbo@wangbo-VirtualBox:~/test/git-demo$ du -sh .git
328K .git
其中 git commit -am 是 git add 和 git commit 的合并写法,提交之后比提交整个文件夹比之前多了 24K,我们计算一下当前工作区的文件大小是多大 (排除 .git 文件夹):
wangbo@wangbo-VirtualBox:~/test/git-demo$ du --exclude=".git" -sh
24K .
原来 .git 在提交的时候,除了记录变更历史信息等操作外,我们有理由怀疑 git 直接把我们的文件进行了一次 backup,不基于内容差异化保存,这导致 git 的工作速度非常快,而且对非文本文件可以工作顺利,缺点就是会增加磁盘的使用,有些版本管理工具基于内容差异化保存,需要去存储文件的差异,工作就非常的慢,而且不能很好的处理非文本文件。
通过本文的小例子,希望你建立了对工作区、暂存区、版本库的概念,我觉得比直接解释那些晦涩的概念好用。