F1
,并对另一个文件F2进行了更改,但然后执行了git reset --hard HEAD^
,导致所有文件的更改都丢失了。是否有什么方法可以恢复它们?我查看了相关问题: 如何撤消 git reset --hard HEAD~1? 但是该问题假定已经完成了 Git 提交。F1
,并对另一个文件F2进行了更改,但然后执行了git reset --hard HEAD^
,导致所有文件的更改都丢失了。是否有什么方法可以恢复它们?我查看了相关问题: 如何撤消 git reset --hard HEAD~1? 但是该问题假定已经完成了 Git 提交。你可以(需要一些工作)恢复最后一次“git add <file>”之前的文件状态。你可以使用
$ git fsck --cache --no-reflogs --lost-found --dangling HEAD
然后检查'.git/lost-found/other'目录中的文件。
请阅读git fsck手册。
获取 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
如果你看到了一些有趣的东西,可以使用git cat-file blob SHA-1-of-interesting-file
将文件输出到标准输出。 (例如:git cat-file blob b8f0bdf56 > recovered-logo.png
)
不幸的是,如果丢失的文件不是任何提交的一部分,则 git 没有时间戳,因此无法按时间顺序打印各个版本的文件。
如果丢失的文件从未被暂存(git stage
或 git 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' )
这将使用所有分支、所有Reflog和所有悬挂提交来运行gitk
。如果您的存储库有非常多的提交(比如Linux内核),您可能需要添加-n 10000
或其他限制。如果您没有gitk
,您可以使用仅命令行的较小版本运行,像这样:
git log --all --decorate --stat --graph --date-order $( git fsck | awk '/dangling commit/ {print $3}'; git log -g --pretty='format:%H' )
或者使用输出更简洁的版本。
git log --all --decorate --oneline --graph --date-order $( git fsck | awk '/dangling commit/ {print $3}'; git log -g --pretty='format:%H' )
如果你看到某个提交,想要将其保存为名为 recovered1
的分支,只需执行 git checkout -b recovered1 <sha1-of-the-commit>
。
git fsck --no-reflogs --lost-found
命令,然后在 .git/lost-found/other
目录下搜索它(使用 Notepade++ 的 Find in Files 搜索)。谢谢! - Ofir尝试这个http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html
我因为丢失的更改而感到心慌,但是在按照这篇文章的步骤后,我找回了我的更改。
有一个 git插件
可以直接做到这一点:
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