做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
是你的朋友。)
-
获取
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没有时间戳,因此,您不能打印按时间sorting的各种版本的文件。
如果丢失的文件从来没有上演过( 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' )
或者具有较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