我不小心说了git rm -r ..我该如何从中恢复呢?

我没有承诺。

我认为所有的文件都被标记为删除,并从我的本地签出中物理删除。

编辑:我可以(如果我知道命令)恢复到上次提交。但如果我能撤销git rm -r ..因为我真的不确定我在最后一次提交之后和git rm -r之前做了什么。


当前回答

撤销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.

未提交的更改包括非阶段性更改,阶段性更改但未提交。

其他回答

我收集了一些文件,并在下次提交之前继续修改,这时我意识到我需要其中一些文件。而不是隐藏和重置,你可以简单地签出你错过/删除的个别文件,如果你想:

git checkout HEAD path/to/file path/to/another_file

这使得其他未提交的更改没有任何变通办法。

使用Git 2.23+(2019年8月),恢复文件(和索引)的正确命令是使用…Git恢复(不是重置——很难或令人困惑的Git checkout命令)

那就是:

git restore -s=HEAD --staged --worktree -- .

或其缩写形式:

git restore -s@ -SW -- .

已经有了一些很好的答案,但我可能会建议一个很少使用的语法,它不仅工作得很好,而且非常明确地表达了您想要的东西(因此并不可怕或神秘)。

git checkout <branch>@{"20 minutes ago"} <filename>

获取列表提交

git log  --oneline

例如,稳定提交的哈希值为:45ff319c360cd7bd5442c0fbbe14202d20ccdf81

git reset --hard 45ff319c360cd7bd5442c0fbbe14202d20ccdf81
git push -ff origin master
git reset HEAD

应该这么做。如果您不关心任何未提交的更改,那么

git reset --hard HEAD

应该强制重置您上次提交的所有内容。如果你有未提交的更改,但是第一个命令不起作用,那么用git stash保存你未提交的更改:

git stash
git reset --hard HEAD
git stash pop