在Git的语境中,“TREESAME”一词是什么意思?

17

我在git log手册中看到很多关于TREESAME的提及,但是我不知道它是什么意思。

3个回答

3

如果给定两个或多个树,只有当路径规范在相应的树之间没有明显的区别时,路径规范才被认为是TREESAME

更直观地说,可以将TREESAME理解为“在树之间相同”。


2
根据你提到的git-log手册所定义的内容:

假设您指定了foo作为<paths>。我们将修改foo的提交称为!TREESAME,其余的称为TREESAME。(在过滤了foo的diff中,它们分别看起来不同和相同)


6
我需要更简单/另一种方式的解释。我已经阅读了文档,但仍然不理解。 - brk3
1
如果重要的上下文被删除,从手册中添加片段并没有帮助到什么。 - Tyson

1

初学者指南:Git树对象和引用

在Git中,每个提交都包括4个基本数据:

  1. 提交哈希值。
  2. 任何父提交(初始提交为空集)。
  3. 提交元数据,包括作者、提交者和提交消息。
  4. 树对象引用。

大多数开发者熟悉前3个,但树对象引用并不为人所知,可能是因为默认情况下它非常隐藏——甚至使用--format=full--format=fuller选项的git show/git log/等命令也不会显示它。

要查看与每个提交相关联的树哈希,请使用--format=raw选项(或在格式规范中包含%T/%t),例如:git show --format=rawgit log --format="format:commit:%h tree:%T %s"等命令。

单独的提交可以引用存储库中的任何树对象,包括其他提交引用的对象。

git ls-tree <tree-ish>命令向您显示树对象的内容。输出格式为<mode> SP <type> SP <object> TAB <file>。模式反映了文件类型(例如:普通文件或符号链接)、权限(例如:用户/组/全局读取/写入/执行)等。类型是目录的tree(树是递归结构),也可以是其他任何东西的blob。使用git cat-file -p <object>以漂亮的方式打印任何对象的内容。敏锐的观察者会注意到缺少任何与时间相关的元数据,因此Git不会更新文件的修改/创建时间。

现在,您已经掌握了提交与树的关系以及树中包含什么,我们可以真正理解你问题的答案。

在Git上下文中,TREESAME这个词是什么意思?

任何引用相同树对象(具有相同的树哈希值)的提交都是"TREESAME"。

TREESAME概念也可以应用于树中的特定路径——这就是git log <path>选择要显示给定路径的提交的方式。请参见Git文档中有关历史简化的部分,了解更多细节。


@matt 最后一句已删除。 - Tyson
1
很好,这现在是一个非常好的解释。只有一个警告:Git文档使用TREESAME来表示提交树中特定路径(文件),而不仅仅是整个树。如果A有foo和bar,它的子节点B具有未修改的foo但修改了bar,则B和A整体上不是treesame,但它们相对于foo是treesame的。这不仅仅是一个小问题;这种情况正是“git log”文档在大多数情况下所关注的内容。简单明了地说,如果两个提交“包含”相同的foo,则它们相对于foo是treesame的。 - matt
请注意,这正是 https://dev59.com/sGYr5IYBdhLWcg3wW49t#45315334 试图表达的意思。你想要做的是说得更加清晰明了。 - matt
1
@matt 感谢你的建议。我已经添加了有关如何将TREESAME概念应用于路径的详细信息,但是我不愿再添加更多内容,因为对于那些刚接触TREESAME概念的人来说,这已经很难理解了。 - Tyson
@matt 当我说“如果分支的HEAD提交引用相同的树对象,则分支是TREESAME”,术语“commits”指的是来自分支FOO的提交A和来自分支BAR的提交B的复数 - 有多个分支,因此有多个提交。 我并没有暗示任何特定分支顶部有多个提交,但确实我可以用更好的措辞表达。 - Tyson
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接