恢复被添加到 Git 但未提交并被 Git reset --hard 意外删除的文件

4

我有一个很大的问题。昨天我不小心将开发和生产终端并排打开,并运行了代码。

git add .

在生产环境中,这导致将所有文件暂存到public/uploads路径中。当我尝试

git status

该命令显示public/uploads文件夹中的所有文件都已准备好进行提交。但由于我不想在生产环境中进行任何提交或推送,因此我从未提交这些更改。生产环境中的SSH密钥没有推送权限,只有克隆/拉取权限。

因此,我运行了以下命令来强制从远程代码库中拉取我的新代码:

git fetch --all
git reset --hard  origin/master
git pull origin master

但是现在我发现它删除了public/uploads路径中的所有文件以及该目录本身。当我进行检查时,

git status

我看到 "Your branch is up-to-date with 'origin/master'",有没有办法从已删除的目录中恢复文件?这些文件非常重要...

你所需要做的就是仔细阅读 git status 命令的输出。它会在列出已暂存文件之前告诉你如何取消暂存文件:使用 "git reset HEAD <file>..." 命令即可取消暂存。 - axiac
你只需要获取文件的内容吗?这很容易恢复,但你必须自己提供相应的文件名。 - Vampire
可能是恢复被git reset从索引中删除的文件的重复问题。 - Andreas Wederbrand
可能相关:https://dev59.com/2XNA5IYBdhLWcg3wC5Xh - Sven Koschnicke
1个回答

2
据我所知,git add 在提交之前就会将其参数文件注册到仓库中。如果它们没有被提交,那么它们将在以后被垃圾回收。因此,如果您及时采取行动,应该有一种方法可以从仓库中恢复这些文件。
尝试在存储库目录的根目录下运行以下 bash 脚本。它将创建一个新的子目录recovering_lost_files,其中包含比您的 HEAD 提交更新的 git 对象(因此对应于 git add 的但未提交的文件)。不幸的是,文件名不会自动恢复。 recover_lost_files:
#!/usr/bin/env bash

headcommit="$(git log --format=format:%H)"
headcommitobject=".git/objects/${headcommit:0:2}/${headcommit:2}"
mkdir recovering_lost_files
find .git/objects/ -type f -newer "$headcommitobject"|while read -r path
do
    obj="${path#.git/objects/}"
    obj="${obj/\/}"
    git cat-file -p $obj > recovering_lost_files/$obj
done

谢谢!这似乎有效,一些文件出现在recovering_lost_files中。 - Patrik Šimunič

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接