一个空的提交在git中有一个空树吗?

Hob*_* C. 4 git

我读了这篇Git Internals,关于树对象的一些事情不是很清楚。

例如,当前分支是master。master 上的最终提交对象是一个空提交,用 表示cmt_end。由 给出git-commit-tree,提交对象只有一个树对象。因此, 的树对象cmt_end用 表示tree_end

我的困惑是:

  • 由 给定git-commitgit-commit记录存储库中的更改。这是否表明包含与其父级tree_end之间的差异?cmt_end如果是这样,tree_end应该是一个空树,因为cmt_end是一个空提交。如果不是,是否可以为空提交提供一个空树?
  • --allow-empty中的选项表示git-commit空提交与其唯一父提交具有完全相同的树。这是否表明提交的树对象记录了整个工作目录而不是执行时的更改git-commit

Elp*_*Kay 5

树对象记录了整个工作目录。提交对象记录树对象和其他条目,例如作者姓名、提交者日期和提交消息,您可以在git log -1 <commit> --pretty=raw或中看到这些条目git cat-file -p <commit>

--allow-empty指示git commit创建一个重用其父对象的树对象的提交对象。如果新提交是没有任何父级的根提交,则树对象是一个特殊的对象,即空树,其 SHA-1 为4b825dc642cb6eb9a060e54bf8d69288fbee4904。空树映射到一个空目录,其中没有任何子目录或文件。in表示自上次提交或初始状态empty以来--allow-empty没有进行任何更改。

当空提交有父级时,其树与父级的树相同。该树可以是空树或非空树,具体取决于父级引用的树。当空提交没有父级时,它的树始终是空树。