我正在使用源代码树。我创建了多个更改的存储库并错误地删除了它。有办法找回来吗
根据之前的答案,这里有一个简单的序列:
打开终端窗口并 cd 进入存储库下的文件夹。然后:
git fsck | awk '{print $3}' > tmp.txt
cat tmp.txt | xargs git show > tmp2.txt
现在在编辑器中打开tmp2.txt,找到丢失的代码,然后找到其顶部的commit-id。然后应用代码:
git stash apply <commit id>
rm tmp.txt tmp2.txt
这救了我的命!我真的感谢所有回答这个问题的人。我祝福 git 创建者 Linus Torvalds 将已删除的内容保留在 git 数据库中。天才!!
编辑 2021:请注意,Windows 用户可以使用 Git Bash 执行相同操作。
存储在内部保存为从存储列表引用的合并提交。
git fsck
可以找到悬挂的物体。它不仅会找到您删除的存储,还可能找到其他东西...所以您会想要查找看起来可能是您的存储的提交(git show <ID>
以显示有关对象的相关信息并决定是否这就是您要找的人)。
一旦获得,您所需要做的就是将其重新插入到存储列表中。该列表存储在
.git/logs/refs/stash
中,一行具有以下格式:
<ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> <ID of merge commit> Your Name <[email protected]> <UNIX timestamp> <time zone, e.g. +0000><TAB char><description of stash>
这是一个工作示例:
16b9a2d400dafe7ea25592029e3e5582d025c7d8 5def7605dfe625e8b3a3152fe52a87cc36694b6a Jan Krüger <email.censored@invalid> 1374227992 +0200 WIP on master: 0dbd812 Update draft release notes to 1.8.4
只需为您想要重新插入的存储合成一行(名称/邮件/时间戳/描述不有准确),您应该能够再次正常使用它。
狩猎快乐!
与之前的答案一样,您可以使用
git fsck
列出以下对象:
不会被任何包含您已删除的存储的内容引用。但它
可以使用 git show
过滤该对象列表以仅显示
藏品如:
git fsck 2> /dev/null |
awk '/commit/{print $3}' |
git show --stdin --merges --grep '^WIP on'
如果您知道存储的创建时间,您还可以添加一个参数,例如
--since '2 days ago'
到最后一行以进一步限制输出。希望这会将列表缩减到可管理的大小。
找到正确的存储后,记下其提交 ID,然后就可以使用
git stash apply COMMITID
应用它,就好像它没有被删除一样。
在隐藏时使用注释可能会有所帮助,使用:
git stash save "comment"
它为我节省了一些使用以下命令查找已删除存储的麻烦:
git fsck --lost-found
ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline
git stash apply [tag]
另一个解决方案是:
git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log
查找作者并提交信息(日期、哈希、作者等)
git stash store <hash-id-of-specific-commit>
正如 Jan Krüger 上面所说,
git fsck
是正确的选择。但是,如果您发现自己无法(无论出于何种原因)成功合成存储文件中的一行并使该存储出现在可用列表中,则可以直接使用 git stash apply <guid>
,而无需添加该行。这将立即将文件更改应用(而不是提交)到您当前的分支。
for i in $(git fsck 2>|/dev/null | grep commit | cut -d' ' -f3); do git --no-pager log -1 $i; echo "-------------------------"; done | less
然后找到提交id#。
然后做
git stash apply {commit#}
只是 Tengku Fathullah 答案的 Windows 版本
git fsck --lost-found
for /f %f in ('dir /b .git\lost-found\commit') do @git log -n 1 %f --pretty=oneline
git stash apply [tag]
(其中 [tag] 是从第二个命令中选择的 ID)。
如果这仍然是一个很长的列表需要查找,可以将其通过管道传输到
find
。例如,对于未命名的存储:
for /f %f in ('dir /b .git\lost-found\commit') do @git log -n 1 %f --pretty=oneline | find "WIP"
批处理文件注释,仅供参考:
for
命令一样,请注意,在批处理文件中需要 %%f
(两次)@git log
用于抑制命令提示符回显,以提供单行输出