我在git log手册中看到很多关于TREESAME
的提及,但是我不知道它是什么意思。
如果给定两个或多个树,只有当路径规范在相应的树之间没有明显的区别时,路径规范才被认为是TREESAME
。
更直观地说,可以将TREESAME
理解为“在树之间相同”。
假设您指定了foo作为
<paths>
。我们将修改foo的提交称为!TREESAME,其余的称为TREESAME。(在过滤了foo的diff中,它们分别看起来不同和相同)
在Git中,每个提交都包括4个基本数据:
大多数开发者熟悉前3个,但树对象引用并不为人所知,可能是因为默认情况下它非常隐藏——甚至使用--format=full
或--format=fuller
选项的git show
/git log
/等命令也不会显示它。
要查看与每个提交相关联的树哈希,请使用--format=raw
选项(或在格式规范中包含%T
/%t
),例如:git show --format=raw
或git 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不会更新文件的修改/创建时间。
现在,您已经掌握了提交与树的关系以及树中包含什么,我们可以真正理解你问题的答案。
任何引用相同树对象(具有相同的树哈希值)的提交都是"TREESAME"。
TREESAME概念也可以应用于树中的特定路径——这就是git log <path>
选择要显示给定路径的提交的方式。请参见Git文档中有关历史简化的部分,了解更多细节。