在第一次提交之前撤销 "git reset --hard"

3

基本上,我在我的本地计算机上有一个代码库,我运行了:

git init

git add .

在这一点上,我意识到我想要添加一个.gitignore文件。

所以我认为我需要取消暂存的提交,在一个业余的操作中,执行了以下命令:

git reset --hard 

现在我的整个代码库都不见了...

这能够被撤销吗?!


不备份或文件系统支持恢复已删除文件是非常危险的。你相当于执行了 rm * 的命令。 - chepner
哎呀!读到这个问题真是让人头疼。看起来好像没有可以回退的提交。 - TTT
你的文件内容并没有完全丢失,但是重建代码文件目录会有点混乱。你最初的 git add 中有很多不同的文件吗? - LeGEC
2
请查看此答案 - LeGEC
2
请参阅git-recover - choroba
显示剩余2条评论
1个回答

5

git add . 命令已将你的文件内容添加到git中;不过,它没有创建列出文件名和它们的名称的“目录结构”。

您可以执行以下操作:

运行

git fsck --full --unreachable --no-reflog | grep blob > blobs.txt

# the content of blobs.txt will look like :
unreachable blob 08bf360988858a012dab3af4e0b0ea5f370a2ae8
unreachable blob 21bf7ea93f9f9cc2b3ecbed0e5ed4fa45c75eb89
unreachable blob 08c12ef37075732cf4645269ab5687ba6ba68943
...

对于这些数据块中的每一个,您都可以将内容转储到磁盘上:
cat blobs.txt | awk '{ print $3 }' | while read blobid; do
    git show $blobid > $blobid.txt
done

现在,您将拥有一个文件列表:
08bf360988858a012dab3af4e0b0ea5f370a2ae8.txt
21bf7ea93f9f9cc2b3ecbed0e5ed4fa45c75eb89.txt
08c12ef37075732cf4645269ab5687ba6ba68943.txt
...

好消息是:在最初的git add .命令中包含的所有文件都应该在这里表示。
坏消息是:
  • 此列表还将包含您最初想要忽略的文件(我假定您添加了node_modules/文件夹,因此您将拥有您添加的所有js库的代码...),
  • 您必须找出哪些文件属于哪个位置,并将它们重命名为src/my_controller.jssrc/model/my_model.js等。

首先可以应用的一个过滤器,尝试将node_modules/文件排除在外:
  • 在上面的blob列表中,尝试找到您的package.json文件(grep -e some_package_I_remember),
  • 将其重命名为package.json(您也可能会找到lockfile),然后运行npm installyarn install
  • 这将创建一个node_modules/文件夹,看起来非常像之前的那个
  • 添加该node_modules/文件夹,并创建一个提交,
  • 现在,node_modules中的blob不再无法访问;重新运行上面的git fsck ... > blobs.txt命令,您应该会得到一个列表,其中包含node_modules之外的内容...

谢谢你的帮助! - 4cody

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