我正在使用源代码树。我创建了一个包含多个更改的存储,并错误地删除了它。有没有办法找回它们?
答案 0 :(得分:66)
根据以上答案,这是一个简单的序列:
打开终端窗口并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数据库中保留已删除的内容。天才!!
答案 1 :(得分:46)
存储内部保存为从存储列表引用的合并提交。
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 <your@email.example> <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
只需要为要重新插入的藏匿处合成一行(名称/邮件/时间戳/描述不 准确),您应该能够再次正常使用它
快乐狩猎!
答案 2 :(得分:21)
与之前的回答状态类似,您可以使用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
将其应用,就像它没有被删除一样。
答案 3 :(得分:9)
正如JanKrüger所述,git fsck
是要走的路。但是,如果您发现自己无法(无论出于什么原因)在存储文件中成功合成一行并使存储显示在可用列表中,则可以直接使用git stash apply <guid>
,而无需添加该行。这将立即将(不提交)文件更改应用于当前分支。
答案 4 :(得分:4)
另一种解决方案是:
git fsck 2>&1 | awk '/dangling commit/{print $3 "^!"}' | xargs git log
找到作者并提交信息(日期,哈希,作者等)
git stash store <hash-id-of-specific-commit>
答案 5 :(得分:3)
这是恢复已删除存储的最简洁的解决方法。
答案 6 :(得分:2)
在存储时使用以下注释可能会有所帮助:
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]
答案 7 :(得分:1)
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#}
答案 8 :(得分:0)