在对 Git 基础的学习过程中,我们了解了 Git 仓库的基本结构:

下面我们就通过一次修改、暂存以及提交的工作流程,来理解快照(Snapshot)的概念。
现在,我们在工作目录下新增三个文件:test1.txt、test2.txt、test3.txt。然后,我们执行 git add 将这三个文件暂存。那么,此时这个指令做了哪些事呢?

暂存修改后,执行 git commit,这条指令又做了哪些事情呢?

同时,需要注意的是,在 tree 对象中,实际上包含了对快照的引用,即对所有文件索引的引用。
因此,我们可以总结一下快照的概念:
快照就是在执行
git add和git commit时,对当前暂存区的情况拍摄的一张“照片“,这个照片中涵盖的若干信息将被存放到git版本库下。这些若干信息包括:
- 文件的索引+文件的完整内容(key-value结构)
- 文件的目录结构
- 提交信息
这三者分别用 Git 内置的 blob,tree,commit 对象进行存储。
接下来,我们再次对test2.txt文件进行修改,然后再执行git add和git commit操作:

这里可以看到,在给当前暂存区拍完快照后,Git 发现test1.txt和test3.txt的内容没有变化。因此它只把test2.txt的相关信息存入版本库,并生成了新 tree 和 commit 对象。
同时,旧test2.txt和新test2.txt信息是共存在版本库里的。因此 Git 每次照下保存的都是文件的完整信息,而不是文件的差异。
另外,暂存区的内容也不会随着git commit的完成而消失,因此“把暂存区文件提交上去”这种说法是不准确的,更准确的说法是,暂存区保存着当前待提交的状态,Git 对这个状态拍了照,然后把照片转换成若干信息存入版本库。