做git复位后恢复添加的文件 – 硬头^

我添加了一个新文件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的手册页。

(我假设缺less的文件不是任何提交的一部分,否则, 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 
  2. 如果你看到一些有趣的东西, 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没有时间戳,因此,您不能打印按时间sorting的各种版本的文件。

如果丢失的文件从来没有上演过( 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' ) 

这将与所有的分支,所有的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' ) 

或者具有较less详细输出的版本

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

实际上,如果你已经添加了对象到索引(通过使用git add),为对象的状态创build了一个blob,但是没有树(也就是commit)对象引用它。 这是如何得到一个“晃来晃去”的松散对象文件,如果你运行git fsck它会显示你未被引用的blob(git gc将删除这些types的对象,如果它运行的话)。

因此,您可以使用reflog(如果已启用)来尝试恢复已添加的文件F1的索引状态。 如果你还没有添加F2,那么就像Greg说的那样,git对它一无所知,而且你在那里运气不好。

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

我因为失去的改变而心脏病发作。 但是在继这个post之后。 我得到了我的变化

有一个开箱即用的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