在执行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 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' )
    

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

    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

    上一篇: Recovering added file after doing git reset

    下一篇: How can I merge two commits into one?