深入理解git暂存区

2020-01-20 git

关于暂存区的基本概念可以参阅Git工作区和暂存区一章节。

通过git add命令可以将工作区中指定内容加入暂存区,代码实例如下:

1
$ git add readme.txt

上述代码将工作区中的readme.txt文件加入到暂存区。

从“暂存区”名字来理解,此区域好像是一个仓库,把将要提交的内容暂时存放于此。

上述理解从感性上来说没什么问题,并且有助于接受此概念。

然而暂存区的实质是什么呢,仅仅是一个文件罢了,截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/001723t4dck4mdo1etp1sx.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

所谓的暂存区仅仅是.git目录下的一个index文件罢了,这也是为了什么被称为index(索引)。

下面先看一下当前项目的状态,代码如下:


[Shell] 纯文本查看 复制代码
1
$ git status

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/001828azfl8hll1ol4ojrl.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

可以看到readme.txt文件被修改,位于暂存区待commit提交状态。

现在看一下暂存区内容,代码如下:

1
$ git ls-files --stage

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/001913v5r6r08cc9cgcxct.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

下面我们新增一个文件并将其添加至暂存区,代码如下:

1
$ echo '蚂蚁部落' > antzone.txt

新建一个antzone.txt文件,并写入字符串"蚂蚁部落"。

1
$ git add antzone.txt

将新增的antzone.txt文件添加至暂存区;再来看.git/index文件中的内容:

1
$ git ls-files --stage

代码运行截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/002106pfuepemu39d2e5fd.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

由此可见,暂存区叫做index(索引)才是实至名归,的确是指向文件的索引。

真正的文件存储在.git/objects目录中,具体参阅Git存储内容的位置与方式一章节。

下面将暂存区内容提交,并查看提交后的状态,代码如下:

1
$ git commit -m "c5"

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/002148z1tbxtztf3a4tf8t.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

由此可见,工作区没有新增或者修改的文件,暂存区也没有待提交文件。

再来看index文件中的内容,代码如下:


[Shell] 纯文本查看 复制代码
1
$ git ls-files --stage

代码运行截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/18/002253xyysbsyeynbtyeye.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

暂存区依然如故,并不像是我们感性上认为被清空。

当删除暂存区内容的时候,其实就是删除index文件中的内容,.git/objects目录中的内容不会被删除。

删除命令如下:

1
$ git rm --cached readme.txt