恢复已添加到git但未提交但随后被git reset --hard意外删除的文件

时间:2017-01-19 11:15:07

标签: git

我有一个很大的问题。昨天我误认为开发和生产终端并排开放并且运行

git add .

关于生产。这导致在公共/上传路径中暂存所有文件。我试过的时候

git status

它显示公共/上传中的所有文件都已暂存并准备提交。但是我从未做过这些改变,因为在制作中我不想要任何提交或推动。生产中的SSH密钥没有推送权限,只能克隆/拉取。

所以我运行这些命令强制从远程存储库中提取新代码

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

但是现在我发现它删除了public / uploads路径中的所有文件以及它自己的目录。当我检查

git status

我看到了"您的分支机构与“原点/主人”是最新的。 &#34 ;.有没有办法如何从已删除的目录中恢复文件?这些文件非常重要......

1 个答案:

答案 0 :(得分:1)

据我所知,git即使在提交之前,也会在存储库中注册其参数文件。如果他们没有提交,那么他们将在以后进行垃圾收集。因此,如果您立即采取行动,应该有一种从存储库中恢复文件的方法。

尝试在存储库目录的根目录中运行以下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