在执行git reset之后恢复添加的文件
我添加了一个新文件F1,并对另一个文件F2进行了更改,但之后执行了“git reset --hard HEAD ^”,并且我丢失了文件的所有更改。
有没有办法,我可以让他们回来。
我在这里看到了一个相关的问题:如何撤消git reset --hard HEAD〜1? 但是,这个问题假设他已经做了一次git commit。
你可以(有些工作)在最后的“git add <file>”中恢复文件的状态。 您可以使用
$ git fsck --cache --no-reflogs --lost-found --unreachable HEAD
然后检查'.git / lost-found / other'目录中的文件。
请阅读git fsck的手册页。
(我假设缺少的文件不是任何提交的一部分,否则, git log --all -g --diff-filter=D --stat
是你的朋友。)
获取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 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
。 你可能想要添加-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' )
或者具有较少详细输出的版本
git log --all --decorate --oneline --graph --date-order $( git fsck | awk '/dangling commit/ {print $3}'; git log -g --pretty='format:%H' )
有一个开箱即用的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
链接地址: http://www.djcxy.com/p/551.html