题目
Git 的三个工作区和三种文件状态
答案
我们在使用 Git 的时候一般有 3 个工作区的概念: 1. 工作目录(Working Directory) 2. 暂存区域(Staging Area) 3. Git 仓库(Repository) 其中工作目录比较好理解,就是我们开发时修改文件的那些目录,Git 仓库就是我们项目目录下面的 `.git`目录中的内容,而暂存区域是保存已经被Git标记过,将要提交保存到 Git 仓库中的文件的地方 文件从我们创建到编辑完提交Git帮我们记录,一共要经历3种状态: 1. 已修改(modified):刚刚开始时编辑文件,这个时候文件是处于已修改(modified)状态,文件是在**工作目录** 2. 已暂存(staged):修改完文件,我们执行`git add`,这个时候文件就变为 已暂存(staged)状态,文件信息进入**暂存区域**,内容被保存到Git数据库中 3. 已提交(committed):然后我们执行`git commit`,文件就变为已提交(committed)状态,创建了一个提交记录保存到了**Git 仓库** 具体过程可以参见下图 ![](https://cs-wiki.oss-cn-shanghai.aliyuncs.com/image-20241109212100221.png) 暂存区域是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。对应于 **index文件** 中的内容。 这里需要特别注意暂存区里保存的内容,我们可以通过 `git ls-files --stage` 命令来查看下里面的内容 ```javascript git ls-files --stage // 输出 100644 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 0 text.txt 100644 83baae61804e65cc73a7201a7252750c76066a30 0 bak/test.txt ``` 可以看到,暂存区里记录了文件的内容所对应的数据对象,以及文件的路径(文件名和文件所在目录)。实际上,暂存区保存的是一系列指向文件的索引,真正的文件内容都在 `.git/objects` 目录下,也就是Git数据库中。 考虑2种情况: 情况一:如果此时,我们修改 `text.txt` 文件,然后重新 `add` 进暂存区,那暂存区会怎么变化? 实际上,暂存区还是只有2条索引,只不过指向 `text.txt` 文件的索引变成了新的(这个时候 `.git/objects` 目录下会多出一条记录,记录`text.txt` 文件的新版本) 情况二:如果此时,我们删除一条记录,比如`text.txt` 文件的索引记录,会有什么影响? 首先 `.git/objects` 目录下对应的那条数据并不会被删除,这也就是开头说的 **你执行的 Git 操作,几乎只往 Git 数据库中增加数据** ,不会删除数据。 暂存区`text.txt` 文件的索引会被删除,`text.txt` 文件就会重新变为待 `add` 状态,此时如果我们执行 `commit` 操作,提交的内容将不会包含`text.txt` 文件。