Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
先来看名词解释。
工作区(Working Directory)
就是你在电脑里能看到的目录,比如之前创立的gitearning
文件夹就是一个工作区。
版本库(Repository)
工作区中有一个名为.git
的隐藏目录,这并不是工作区的一部分,而是Git的版本库所在地。Git的版本库中存储了许多关键信息,其中最重要的是暂存区(也称为index)。暂存区是一个用于准备提交的区域,你可以将修改后的文件添加到暂存区,然后再一起提交到Git仓库中。
除了暂存区,Git还为我们自动创建了一个名为master
的分支。分支是Git中用于并行开发的功能,每个分支都代表了一个独立的开发线路。master
分支通常是默认的主分支,用于存储稳定的代码。
在Git中,还有一个名为HEAD
的指针,它始终指向当前所在的分支的最新提交。通过HEAD
,Git能够知道当前的工作是基于哪个版本的,从而确保每次提交和回退操作都是准确无误的。
当我们想要把文件添加到Git版本库中时,这个过程分为两个步骤:
-
使用
git add
命令将文件添加到暂存区。这一步是将你对文件的修改标记为准备提交的状态。 -
使用
git commit
命令提交暂存区的更改。这一步实际上是将暂存区中的所有修改内容正式提交到Git的版本库中。
值得注意的是,当我们首次创建一个Git版本库时,Git会自动为我们创建一个名为master
的分支。因此,在默认情况下,执行git commit
命令时,实际上是向master
分支提交更改。
现在,我们再练习一遍,先对readme.txt
做个修改,比如加上一行内容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
然后,在工作区新增一个LICENSE
文本文件(内容随便写)。
先用git status
查看一下状态:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
LICENSE
no changes added to commit (use "git add" and/or "git commit -a")
Git非常清楚地告诉我们,readme.txt
被修改了,而LICENSE
还从来没有被添加过,所以它的状态是Untracked
。
现在,使用两次命令git add
,把readme.txt
和LICENSE
都添加后,用git status
再查看一下:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: LICENSE
modified: readme.txt
现在,暂存区的状态就变成这样了:
所以,git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。
$ git commit -m "understand how stage works"
[master e43a48b] understand how stage works
2 files changed, 2 insertions(+)
create mode 100644 LICENSE
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:
$ git status
On branch master
nothing to commit, working tree clean
现在版本库变成了这样,暂存区就没有任何内容了: