【问题标题】:Why does Git store the file in the repository when I just add it to the staging area?为什么我只是将文件添加到暂存区时,Git 将文件存储在存储库中?
【发布时间】:2017-11-23 20:49:12
【问题描述】:

据我了解,当您git add 一个文件时,它只是在将文件添加到存储库之前暂存文件,但为什么我在提交之前可以看到它已添加到 git 存储库中?

例如,如果我创建一个新的 git 存储库并创建一个名为 foo 的新文件并将内容“hello world”添加到其中,然后 git add foo,我会在 objects 子目录中看到一个新项目在.git 文件夹内。我什至可以使用git cat-file -p 命令查看objects 文件中新文件的内容。

.git/objects 文件夹中究竟添加了什么? 从技术上讲,暂存文件有什么作用?比如在文件上运行git add 之后会发生什么步骤?如果我知道步骤,也许我会更好地理解它。

【问题讨论】:

  • 我的猜测是,您看到的只是代表当前分支阶段的状态。但这并不意味着已经进行了实际的提交。
  • 我已经编辑了答案以添加说明添加到 .git/objects 中的内容的步骤。

标签: git git-add .git-folder


【解决方案1】:

暂存区是存储库的一部分。

我认为您将存储库的对象数据库与历史混淆了。只有提交是历史的一部分,但 Git 处理的所有对象都是对象数据库的一部分。

想一想:Git 不会驻留在内存中,那么除了在其对象数据库中之外,它还会在哪里记录暂存区的一部分?

【讨论】:

    【解决方案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 压缩后的内容写入磁盘上的对象。 Git 确定要写入的对象的路径(SHA-1 值的前两个字符是子目录名称,后 38 个字符是该目录中的文件名)

    【讨论】:

      猜你喜欢
      • 2017-02-25
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多