执行git reset后恢复添加的文件--hard HEAD ^

Sus*_*adi 59 git version-control

我添加了一个新文件F1并对另一个文件F2进行了更改,但后来又进行了"git reset --hard HEAD ^",我丢失了对文件的所有更改.

一些方法,我可以让他们回来.

我在这里看了一个相关的问题:如何撤消git reset --hard HEAD~1? 但是,这个问题假设一个人做了一个git提交.

Jak*_*ski 104

您可以(通过一些工作)在最后一个"git add <file> " 恢复文件状态.您可以使用

$ git fsck --cache --no-reflogs --lost-found --unreachable  HEAD
Run Code Online (Sandbox Code Playgroud)

然后检查'.git/lost-found/other'目录中的文件.

请阅读git fsck手册页.

  • 如上所述--unreachable可防止创建".git/lost-found".我使用以下代码改为$ git fsck --cache --no-reflogs --lost-found --dangling HEAD (45认同)
  • 似乎在git 1.9.1上, - 无法访问导致.git/lost-found无法创建 (14认同)
  • `git show -p --format = raw $ blob> $ blob.txt` +1,救了我的命. (6认同)
  • 天哪,这救了我的屁股!感谢雅各布和雅各布。您是在不同国家/地区的同一个人吗? (2认同)
  • 这似乎有效,但我丢失了所有文件扩展名? (2认同)

Mik*_*nen 26

(我假设丢失的文件不是任何提交的一部分.否则,git log --all -g --diff-filter=D --stat是你的朋友.)

  1. 获取git知道文件名的无法访问的文件列表:

    git fsck --unreachable --no-reflogs --no-cache HEAD | fgrep " tree " \
    | cut -d " " -f3 | xargs -r -n1 git ls-tree \
    | fgrep " blob " | cut -d " " -f 3- | sort -k2 -u
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您看到有趣的内容,git cat-file blob SHA-1-of-interesting-file则会将文件输出到标准输出.(实施例:git cat-file blob b8f0bdf56 > recovered-logo.png)

不幸的是,如果丢失的文件不是任何提交的一部分,git没有时间戳,因此,您无法打印按时间排序的各种版本的文件.

如果丢失的文件从未被暂存(git stagegit add)或者被隐藏(git stash),那么你几乎没有运气,因为就git而言,该文件从未存在过.(您可能仍然尝试git fsck --no-reflogs --lost-found在目录.git/lost-found/other中查看并查看是否有任何值得保留的内容,以防git确实因某些幸运事故而丢失了您丢失文件的副本.在这种情况下,您没有文件名可以帮助您文件内容.)

如果你刚刚丢失了一些提交(而不仅仅是文件),你可能想要运行这样的东西:

gitk --all $( git fsck | awk '/dangling commit/ {print $3}'; git log -g --pretty='format:%H' )
Run Code Online (Sandbox Code Playgroud)

这将gitk与所有分支,所有reflog和所有悬空提交一起运行.-n 10000如果您的repo有很多提交(比如linux内核),您可能想要添加或其他一些限制.如果你没有gitk,你可能只使用命令行运行较小的版本,如下所示:

git log --all --decorate --stat --graph --date-order $( git fsck | awk '/dangling commit/ {print $3}'; git log -g --pretty='format:%H' )
Run Code Online (Sandbox Code Playgroud)

或者输出较少的版本

git log --all --decorate --oneline --graph --date-order $( git fsck | awk '/dangling commit/ {print $3}'; git log -g --pretty='format:%H' )
Run Code Online (Sandbox Code Playgroud)

如果你看到一些你想要保存为分支的提交recovered1,那就干脆做git checkout -b recovered1 <sha1-of-the-commit>.

  • 哇!刚刚发现一个未跟踪的文件,该文件被我意外丢弃(甚至没有提交),使用“git fsck --no-reflogs --lost-found”,然后在目录“.git/lost-found/other”中搜索它`(使用_Notepade++_ 的_在文件中查找_ 搜索)。谢谢你! (2认同)

Rav*_*a P 5

试试这个http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html

我因失去的变化而心脏病发作。但是在关注这篇文章之后。我找回来了


Ale*_*xar 5

有一个git plugin开箱即用:

https://github.com/pendashteh/git-recover-index

$ cd /path/to/disatered/repo
$ git clone git@github.com:pendashteh/git-recover-index.git $HOME/.git-recover-index
$ $HOME/.git-recover-index/git-recover-index.sh
Run Code Online (Sandbox Code Playgroud)