您可以尝试将其与git hash-object 和git mktree 拼凑在一起,如The Git Community Book 的Raw Git 章节所述,但我建议使用更简单的方法,即在一次性分离的HEAD 上完成所有工作。
假设您想从当前分支的尖端开始,请转到detached HEAD state
git checkout $(git rev-parse HEAD)
git checkout 的部分闲聊输出暗示了这样做的好处。
您处于“分离 HEAD”状态。你可以环顾四周,做实验
更改并提交它们,您可以丢弃您在此所做的任何提交
在不影响任何分支的情况下执行另一次结帐。
在这里,我创建了新文件,这些文件将让 git 有事可做,并代表您的真正更改
touch new other stuff blah etc
现在不必重新实现 git,让 git 做它已经做的事情
git add -A .
此阶段更改为索引,git write-tree 将愉快地从中创建一个新的树对象。 存储库中机器上的输出是您询问的哈希值。
git write-tree
afba5669cbf579a9f27f1fda66cb0958282fae3a
写入标准输出的哈希是刚刚创建的树对象的哈希,但不必相信我的话。
$ git commit -m 'Throwaway commit'
[detached HEAD 0ae9d12] Throwaway commit
5 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 blah
create mode 100644 etc
create mode 100644 new
create mode 100644 other
create mode 100644 stuff
输出提示新提交的 SHA1 对象名称 (0ae9d12),我们可以用它来确认
$ git rev-parse HEAD
0ae9d12408d1ea7eb02821d66f6de8a2f8423e7f
但是你想知道提交的树对象的哈希值,可以用
$ git rev-parse HEAD^{tree}
afba5669cbf579a9f27f1fda66cb0958282fae3a
请注意,哈希值与git write-tree 的输出相同。
现在,如果您想保留提交,请在此处使用git branch 创建一个新分支。否则,如果你忽略它,提交和未使用的对象最终将作为 git 普通垃圾回收的一部分被丢弃。