Sus*_*adi 59 git version-control
我添加了一个新文件F1并对另一个文件F2进行了更改,但后来又进行了"git reset --hard HEAD ^",我丢失了对文件的所有更改.
有一些方法,我可以让他们回来.
我在这里看了一个相关的问题:如何撤消git reset --hard HEAD~1? 但是,这个问题假设一个人做了一个git提交.
Jak*_*ski 104
您可以(通过一些工作)在最后一个"git add <file> " 恢复文件状态.您可以使用
$ git fsck --cache --no-reflogs --lost-found --unreachable HEAD
Run Code Online (Sandbox Code Playgroud)
然后检查'.git/lost-found/other'目录中的文件.
请阅读git fsck手册页.
Mik*_*nen 26
(我假设丢失的文件不是任何提交的一部分.否则,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
Run Code Online (Sandbox Code Playgroud)如果您看到有趣的内容,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' )
Run Code Online (Sandbox Code Playgroud)
这将gitk
与所有分支,所有reflog和所有悬空提交一起运行.-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' )
Run Code Online (Sandbox Code Playgroud)
或者输出较少的版本
git log --all --decorate --oneline --graph --date-order $( git fsck | awk '/dangling commit/ {print $3}'; git log -g --pretty='format:%H' )
Run Code Online (Sandbox Code Playgroud)
如果你看到一些你想要保存为分支的提交recovered1
,那就干脆做git checkout -b recovered1 <sha1-of-the-commit>
.
试试这个http://gitready.com/advanced/2009/01/17/restoring-lost-commits.html
我因失去的变化而心脏病发作。但是在关注这篇文章之后。我找回来了
有一个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
Run Code Online (Sandbox Code Playgroud)