git commit和git commit-tree有什么区别

hak*_*ami 6 git commit

我正在阅读git对象:blob,tree,commit,tag.为了更好地理解git是如何工作的,我尝试了一些低级命令,比如write-treecommit-tree.

  1. mkdir test; cd test - > git init
  2. 我创建了一个文件git add file.我可以看到生成blob和树对象.git/objects
  3. git write-tree 打印当前的treeID
  4. git commit-tree treeID -m "commit a tree"提交这棵树.在此操作之后,生成一个提交对象,我可以看到它确实包含作者,日期等.但是,我无法检查我的提交使用git log,错误是:fatal: bad default revision 'HEAD'.

经过上面的操作,当我运行时git status,我看到文件仍然在索引中等待提交.什么是和'commit' commit-tree之间有什么区别commit-tree

Tha*_*rif 8

git-commit - 记录对存储库的更改

将索引的当前内容存储在新提交中,以及来自用户的描述更改的日志消息。

git commit“记录对存储库的更改”

SO 处显示git-commit了图示

git-commit-tree - 创建一个新的提交对象

基于提供的树对象创建一个新的提交对象,并在 上发出新的提交对象 id stdout

这通常不是最终用户想要直接运行的。基于提供的树对象创建一个新的提交对象,并在标准输出上发出新的提交对象 ID。除非给出-m或选项,否则从标准输入读取日志消息。-F

  • 这个答案在技术上是准确的,但我认为它并没有强调非常重要的一点。`git-commit-tree` 是一个低级命令,它提交单个树对象,但不执行 `git-commit` 所做的任何后续引用和 Head 工作。如果您在没有后续参考工作的情况下手动执行“git commit-tree”命令,您可以轻松创建一个无法访问的树,该树将被 Git 垃圾清理器删除。请参阅 [Git 自下而上](https://jwiegley.github.io/git-from-the-bottom-up/1-Repository/4-how-trees-are-made.html) 第 8-10 页更多信息。 (3认同)