如何撤消' git checkout -f'找回未提交的更改

时间:2014-12-10 00:34:30

标签: git

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

3 个答案:

答案 0 :(得分:2)

您是否有跟踪文件修改的备份系统?你可以从那里取回它。否则你运气不好 - 经常提交!

答案 1 :(得分:2)

你在Dante's Inferno外面有一个滚雪球的机会,但这取决于一个 非常重要的 一步。

您必须在此之前的某个时间点对这些文件运行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

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

根据您掌握的内容,您可以执行以下两项操作之一:

  • 输入每个悬空blob并手动尝试为其派生文件名,或
  • this site的引用中,您可以尝试使用他们的Bash脚本来拉入所有悬空blob并将它们放入当前目录中,并将其哈希作为文件名。

    我还没有亲自测试过这个剧本,但他确实展示了一个有效的视频。

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

答案 2 :(得分:0)

两个选项:

  1. 检查git stash以查看您之前是否隐藏了这些文件:

    git stash list
    git stash show stash@{0}
    
  2. 如果您之前添加/暂存了这些文件,则可以尝试git fsck --lost-found。 Git会将所有悬空blob保存到./git/lost-found/other目录(尽管它们没有原始文件名)。