根据我对git add
文件的理解,它只是在将文件添加到存储库之前对文件进行分级,但为什么在我提交文件之前我会将其添加到git存储库中?
例如,如果我创建一个新的git存储库并创建一个名为foo
的新文件并将内容“hello world”添加到其中,然后git add foo
,我会在其中看到一个新项目。 objects
文件夹中的.git
子目录。我甚至可以使用objects
命令在git cat-file -p
文件中查看新文件的内容。
究竟添加到.git/objects
文件夹的内容是什么?
在技术上暂存文件有什么作用?就像在git add
文件上运行后发生的步骤一样?如果我知道这些步骤,也许我会更好地理解它。
答案 0 :(得分:3)
暂存区域是存储库的一部分。
我认为您将存储库的对象数据库与历史记录混淆。只有提交是历史记录的一部分,但Git处理的所有对象都是对象数据库的一部分。
考虑一下:Git不会驻留在内存中,那么它还会在哪里记录临时区域的内容而不是其对象数据库?
答案 1 :(得分:2)
我甚至可以使用git cat-file -p命令查看目标文件中新文件的内容。
或git diff --cached
。
究竟是什么添加到
.git/objects
文件夹?
请参阅" Git Internals - Git Objects"
您可以在对象目录中查看文件。这就是Git最初存储内容的方式 - 作为每个内容的单个文件,以内容及其标题的SHA-1校验和命名。子目录以SHA-1的前2个字符命名,文件名为剩余的38个字符。
为什么我可以在我提交之前将其添加到git存储库中?
不要忘记使用git add -p
(--patch
),您可以在提交之前添加文件的部分(hunks)。
索引的目标仍然是(在git add的上下文中)准备下一次提交 它反映了对Git, as created by Linus Torvalds in 2005的最初需求,即集成补丁(它最初只是一个合并经理)
在文件上运行git add之后会发生什么步骤
虽然索引不包含任何文件内容,但.objects会使用松散(非打包)对象:
请参阅Object Storage了解步骤
- Git构造一个以对象类型开头的标题,在本例中为blob。然后,它添加一个空格,后跟内容的大小,最后是一个空字节
- Git连接标题和原始内容,然后计算该新内容的SHA-1校验和。
- Git使用zlib压缩新内容,
- 最后,Git将zlib-deflated内容写入磁盘上的对象。 Git确定要写出的对象的路径(SHA-1值的前两个字符是子目录名称,最后38个字符是该目录中的文件名)