我不小心说了git rm -r .。我该如何从中恢复呢?
git rm -r .
我没有承诺。
我认为所有的文件都被标记为删除,并从我的本地签出中物理删除。
编辑:我可以(如果我知道命令)恢复到上次提交。但如果我能撤销git rm -r .,那就更好了。因为我不确定我在最后一次提交之后和git rm -r .之前做了什么。
更新:
因为git rm .会删除工作签出中的this和子目录以及索引中的所有文件,所以你需要撤消以下每一个更改:
git rm .
git reset HEAD . # This undoes the index changes git checkout . # This checks out files in this and child directories from the HEAD
这应该是你想要的。它不会影响签出代码或索引的父文件夹。
以前的答案不是:
reset HEAD
不会删除任何未提交的更改你已经对你的文件做了。
之后,你需要重复你已经排队的任何git add命令。
git add
git reset HEAD
应该这么做。如果您不关心任何未提交的更改,那么
git reset --hard HEAD
应该强制重置您上次提交的所有内容。如果你确实有未提交的更改,但第一个命令不起作用,那么使用git stash保存未提交的更改:
git stash
git stash git reset --hard HEAD git stash pop
我收集了一些文件,并在下次提交之前继续修改,这时我意识到我需要其中一些文件。而不是隐藏和重置,你可以简单地签出你错过/删除的个别文件,如果你想:
git checkout HEAD path/to/file path/to/another_file
这使得其他未提交的更改没有任何变通办法。
如果上述方法都不能正常工作,则可以使用http://www.spinics.net/lists/git/msg62499.html中的建议来检索数据
git prune -n git cat-file -p <blob #>
要重新获得一些单个文件或文件夹,可以使用以下方法
git reset -- path/to/file git checkout -- path/to/file
这将首先为path/to/file重新创建索引项,并重新创建上次提交时的文件,即__abc1。
path/to/file
提示: one可以向这两个命令传递一个提交散列,以从旧的提交中重新创建文件。详见git reset --help和git checkout --help。
git reset --help
git checkout --help
已经有了一些很好的答案,但我可能会建议一个很少使用的语法,它不仅工作得很好,而且非常明确地表达了您想要的东西(因此并不可怕或神秘)。
git checkout <branch>@{"20 minutes ago"} <filename>
我也遇到过同样的情况。对我来说,解决方案是:
git checkout -- .
如果您已经提交并提交了更改,那么您可以这样做来取回文件
// Replace 2 with the # of commits back before the file was deleted. git checkout HEAD~2 path/to/file
我有完全相同的问题:清理我的文件夹,重新安排和移动文件。我输入:git rm .并按enter;然后我觉得我的肠子松了一点。幸运的是,我没有立即输入git commit -m ""。
但是,下面的命令
git checkout .
恢复了一切,救了我的命。
获取列表提交
git log --oneline
例如,稳定提交具有哈希:45ff319c360cd7bd5442c0fbbe14202d20ccdf81
45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81 git push -ff origin master
撤销git rm
git rm file # delete file & update index git checkout HEAD file # restore file & index from HEAD
撤销git rm -r
git rm -r dir # delete tracked files in dir & update index git checkout HEAD dir # restore file & index from HEAD
撤销git rm -rf
git rm -r dir # delete tracked files & delete uncommitted changes not possible # `uncommitted changes` can not be restored.
Uncommitted changes包括not staged changes, staged changes but not committed。
Uncommitted changes
not staged changes
staged changes but not committed
使用Git 2.23+(2019年8月),恢复文件(和索引)的正确命令是使用…git restore(不是reset --hard或令人困惑的git checkout命令)
git restore
reset --hard
git checkout
那就是:
git restore -s=HEAD --staged --worktree -- .
或其缩写形式:
git restore -s@ -SW -- .
如果你在一个没有暂存(所以也没有提交)更改的repo上执行git rm -r --cached .命令,你可以用git restore --staged .命令撤销该操作(从删除中取消暂存)
git rm -r --cached .
git restore --staged .
因此,简单地说,要撤销 git rm -r --cached .,你只需要运行git restore --staged .