如何撤消“git checkout -f”以取回未提交的更改

ssg*_*gao 4 git

我不小心输入了,git checkout -f因为我试图恢复已删除的文件,但现在所有未提交的文件都消失了...这是一天的工作...有没有办法将其恢复?谢谢。

Mak*_*oto 6

在但丁的地狱之外,你有一个滚雪球的机会来完成这个,但这取决于一个非常重要的一步。

您必须git add在此之前的某个时刻运行过这些文件。

否则,你就不是玩得很开心。

如果有,那么您可以运行git fsck --lost-found以恢复已删除的任何文件。您将得到的不是确切的文件名,而是一个悬空的提交 blob。

makoto@LATLON-Undefined:~/Desktop/smoketest$ echo "Goodbye file" > badfile.txt
makoto@LATLON-Undefined:~/Desktop/smoketest$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

    badfile.txt

nothing added to commit but untracked files present (use "git add" to track)
makoto@LATLON-Undefined:~/Desktop/smoketest$ git add .
makoto@LATLON-Undefined:~/Desktop/smoketest$ git reset --hard HEAD
HEAD is now at 7124f25 Initial
makoto@LATLON-Undefined:~/Desktop/smoketest$ git status
On branch master
nothing to commit, working directory clean
makoto@LATLON-Undefined:~/Desktop/smoketest$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling blob 4a503984f4847abd45f4d795d1b74c6482164dcb
Run Code Online (Sandbox Code Playgroud)

这些 blob 都没有附加任何文件信息;即它们是什么文件名。但它们仍然是您的数据。

根据您手头上的情况,您可以执行以下两项操作之一:

  • 输入每个悬空 blob 并手动尝试为其派生文件名,或者
  • 参考此网站,您可以尝试使用他们的 Bash 脚本来提取所有悬空的 blob,并将它们放入当前目录中,并以其哈希值作为文件名。

    我还没有亲自测试过这个脚本,但他确实展示了它的工作视频。

    for blob in $(git fsck --lost-found | awk '$2 == "blob" { print $3 }');
        do git cat-file -p $blob > $blob.txt;
    done
    
    Run Code Online (Sandbox Code Playgroud)