情况是这样的:我在我的 git 存储库中丢失了一些工作,这项工作曾经提交过,但现在埋在我的历史中,某个地方可能无法通过'git log --all'强>。 我唯一能记住的是一些不同的字符串,可以精确定位属于我此时工作的一部分的文件。
我有一个解决方案......但是它很长,你有更好的解决方案吗?
这是我的解决方案:
我已经通过批处理几个命令找到了我的提交 SHA1:
- 首先在 .git/objects 中找到所有“blob”对象,“git cat”它们(并使用 grep)以找到包含我的文件的 blob 的 SHA1。
- 然后我必须解析所有“树”对象以找到包含文件 SHA1 的对象……直到没有包含在其他“树”对象中的树对象。
- 最终解析包含此根树的所有提交。
最佳答案
如果提交可以从某个引用到达,最佳解决方案肯定是镐搜索:git log -Sstring --all
.
如果无法访问,那么您是对的,您将不得不进行一些挖掘。如果您认为悬空提交散落在各处,最简单的做法是使用 git fsck --lost-found
。找到你悬空的提交。 (它还会打印悬挂的 Blob 。)然后您可以使用 git grep <commit>
在每个 SHA1 上,找到您的字符串。
另一方面,如果你认为你有几个候选分支被修剪了,你的目标将在其中一个上,我会使用 git reflog show
回顾你的 reflogs,找到它们顶端的提交,并重新创建它们,所以你可以做 git log -Sstring <branches> ^master
.
关于git - 如何找到包含给定字符串的文件的树的提交 SHA1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3451232/