【问题标题】:Undo 'git reset --hard' before first commit在第一次提交之前撤消 'git reset --hard'
【发布时间】:2020-11-16 22:39:26
【问题描述】:

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

git init

git add .

此时,我意识到我想添加一个 .gitignore 文件。

所以我认为我需要取消提交,并在业余动作中执行以下命令

git reset --hard 

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

可以撤销吗!?

【问题讨论】:

  • 并非没有备份或文件系统支持来检索已删除的文件。你做了相当于rm *
  • 哎哟!读这个问题很痛苦。看起来没有要返回的提交。
  • 你的文件内容并没有完全丢失,但是重建你的代码文件目录会有点乱。您的初始 git add 中有许多不同的文件吗?
  • 看看this answer
  • 另见git-recover

标签: git


【解决方案1】:

git add . 已将您文件的 content 添加到 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
...

对于每个 blob,您可以将内容转储到磁盘:

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(您也可以找到锁定文件),然后运行npm installyarn install
  • 这应该会创建一个node_modules/ 文件夹,它看起来很像您之前的文件夹
  • 添加 node_modules/ 文件夹,并创建一个提交,
  • 现在,node_modules 中的 blob 不再无法访问;重新运行上面的git fsck ... > blobs.txt,你应该在node_modules 下有一个不是的列表...

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2015-02-10
  • 2020-05-07
  • 2018-05-30
  • 2015-09-15
  • 2010-09-05
  • 2015-01-10
相关资源
最近更新 更多