我可以签出git中的树对象吗?

我可以签出git中的树对象吗?,git,Git,我在损坏的存储库中丢失了提交对象,但仍有一些文件和树对象: $ git fsck Checking object directories: 100% (256/256), done. dangling blob 031be26142ed97da216fb7d79d16a0b0efdf0d71 dangling blob 4b2be7dfef082c2e247be52e6d78600af7b6dd40

我在损坏的存储库中丢失了提交对象,但仍有一些文件和树对象:

$ git fsck                                                
Checking object directories: 100% (256/256), done.
dangling blob 031be26142ed97da216fb7d79d16a0b0efdf0d71
dangling blob 4b2be7dfef082c2e247be52e6d78600af7b6dd40
dangling tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
dangling blob ccbb1056cb4e744f9a4b44a439fa036f6a3d7cbe
dangling blob 10bfbc3c1fa10e08cd6a783565f00e7324f61fe5
dangling blob 9b529957be714fef304c4e8161fe6cd138510e98
dangling blob dd5b54882d0b74db99c8a7fbba703d528dc559b9
有没有办法检出树对象

我想可能有一种方法可以用一个伪提交字符串重新生成提交对象并检查它

git cat-file -p tree-sha1
试一试

或者更干净一点

git read-tree --prefix=rescue --index-output=/tmp/rescue.index b825dc642cb6eb9a060e54bf8d69288fbee4904
将其放入子文件夹(rescue)


请确保检查树所指的内容,它可能不是存储库根路径:

如果您
git checkout 4B825DC642CB6EB9A060E54BF8D6928FBEE4904。
(路径名的点很重要,否则git会将其解释为分支切换操作并拒绝)它将更新工作目录和索引中的所有文件,以匹配4b825d的状态。。。(也就是说,
git diff
将不显示任何内容,
git diff--staged
将显示大量更改,
git status
将显示大量M)。您可以通过这种方式检查文件的状态

如果您对相关的父提交有猜测,您可以

git checkout -b recover relevant_parent
git checkout 4b825dc642cb6eb9a060e54bf8d69288fbee4904 .
git commit -m "Recovered this thing that git fsck told me about"

要给它一个提交和一个分支来解决它。

如果这种情况经常发生,或者如果您需要从其他提交来回切换,您可以创建一个指向此树的新提交对象,然后创建一个指向它的新分支以方便:

git commit-tree <<treeid>>
<<type a commit message>>
^D
<<this will produce a hash for the new commit object>>
git branch newbranch <<newcommithash>>
git提交树
^D
吉特新牧场分行

然后,您应该能够在需要的时候,
git checkout newbranch

git checkout 4B825DC642CB6EB9A060E54BF8D6928FBEE4904能做到这一点吗。我不知道
git checkout
可以使用树id而不是提交id。和这个奇怪的家伙玩。对我来说不起作用:``>git init>“Test”| git哈希对象-w--stdin[abcd…]>git更新索引--add--cacheinfo 100644 abcd。。。test.txt>git写入树[efg0…]>git签出efg0。。。[致命:无法将分支切换到非提交的'efg0…']``@AxD您忘记了点吗?@hobbs:太好了!谢谢你在这方面的帮助。这个和@sehe的答案都是完美的,但是如果我想将状态恢复到存储库中,这个答案更实用。
git commit-tree <<treeid>>
<<type a commit message>>
^D
<<this will produce a hash for the new commit object>>
git branch newbranch <<newcommithash>>