Git 中的“一棵树”是什么意思?

Tim*_*Tim 4 git

的联机帮助页git diff

姓名

git-diff - 显示提交、提交和工作树等之间的更改

描述

显示工作树和索引或之间的更改、索引和树之间的更改、两棵树之间的更改、两个blob 对象之间的更改或磁盘上两个文件之间的更改。

“工作树”是指工作目录吗?

这里的“一棵树”是什么意思?它与提交对象或树对象相同吗?(从字面上看,我认为它意味着一个树对象。但我想通过将“DESCRIPTION”部分与“NAME”部分进行比较,它可能意味着一个提交对象。)

如何指定“一棵树”作为命令行参数git diff

如果我还想问,如何指定“blob 对象”作为命令行参数git diff

tor*_*rek 7

“树”这个词在 Git 中相当多(嗯,而且在一般计算中)。

\n\n

工作工作树(或该拼写的其他变体)是指您进行工作的地方。在这里,文件具有正常的日常形式,并且是可读的并且\xe2\x80\x94OS愿意\xe2\x80\x94可写。(在 Unix 系统上,如果你chmod -w拥有文件,你将无法写入它们。但这不是 Git 的错。)

\n\n

Git 中的树对象是记录目录树或子树的内部数据结构。它包含每个文件或子目录的一个条目(或者,对于子模块,该子模块的gitlink条目)。每个条目都列出了文件的可执行模式位,作为一种奇怪编码的是或否标志,1加上文件的名称和 blob 哈希 ID。对于子树,该条目列出了目录的名称和子树对象哈希 ID。然后,Git 可以递归地处理子树对象,以根据需要查找更多文件和更多子树。每个文件条目都为 Git 内部blob对象提供一个哈希 ID,该对象是文件数据的冻结(只读)压缩副本。

\n\n

每次提交都会保存一 (1) 个内部 Git 树对象哈希 ID。该树对象包含提交包含的快照\xe2\x80\x94,因此提交的快照实际上是这些树之一,其中包含文件和子树的条目。由于每个提交只有一棵树,Git 可以从提交说明符转换为树对象:

\n\n
$ git rev-parse master\n3c31a203fbeedb4d746889dc77cbafc395fc6e92\n$ git rev-parse master^{tree}\n5c4b695f5d5606976f5b72e1a901ed17db30a359\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这种情况下,由 标识的提交master是第一个丑陋的大哈希,但该提交用于保存文件的内部树对象是第二个。

\n\n

因此,工作树包含具有真实数据的真实文件,并且 Git树对象允许 Git 找到某个提交的所有冻结文件,前提是您给出与某个提交相对应的树对象。该git diff命令需要比较两个事物。这两件事可以是两个单独的文件\xe2\x80\x94(这是一种退化情况\xe2\x80\x94)或两个文件树。当比较两棵树时,无论它们是树对象还是充满文件的工作树,git diff都会:

\n\n
    \n
  • 比较每棵树中的文件名。
  • \n
  • 如果它们匹配,Git 会认为它们是“同一文件”,并将比较文件的内容。
  • \n
  • 如果它们没有匹配的名称,则可以选择尝试按内容匹配文件。
  • \n
  • 如果所有其他方法都失败,请告诉您某些文件已被删除并且某些文件已添加。被删除的文件内容全部被删除;添加的文件的内容是全新的。
  • \n
\n\n

这仍然只是一个概述,因为git diff可以做的不仅仅是这些事情,但这些都是基础知识。

\n\n

还有一个非常重要的问题:git diff可以检查索引并将其视为一棵树。索引保存从某处获取的文件的副本。最初,某个地方就是你git checkout所做的任何承诺。但是,您可以将git add工作树中的文件复制到索引中,替换提交时存在的版本。您可以git add从工作树中提取从未在提交中的文件,因此对于索引来说是新的。并且,您可以git rm使用或不使用 files--cached将文件从索引中取出。

\n\n

由于 Git 会在运行时从索引中的任何内容构建新的git commit提交,因此将索引内容与提交中的某些东西\xe2\x80\x94a 冻结树进行比较,或者工作树\xe2\x80\x94 是一个非常确实有用的东西。

\n\n
\n\n

1实际的树条目存储(模式、路径、哈希)三元组。这mode是一个字符串:100755对于可执行文件,100644对于非可执行文件,40000对于子树,120000对于符号链接,160000对于 gitlink。这些原本是 Linux 的stat st_mode字段,例如 Git 允许100664rw-rw-r--但结果证明这是一个错误,所以普通的树只使用有限子集之一。Git 仍然支持100664,因为可能有一些 Git 存储库仍然有这样的条目,但除非你找到一个非常旧的存储库,否则你不会找到任何 100664。除了gitlink 条目之外,哈希始终是 blob 哈希,其中哈希是子模块中所需的提交哈希。

\n