Git checkout -- 恢复丢失的文件

7

我在git仓库上意外删除了本地文件更改。它们没有被提交或推送。

我的操作步骤是: git status (然后未暂存的文件显示出来,我无意中使用以下命令删除了名为"smdr"的整个文件夹): git checkout -- smdr

然后,文件更改消失了。

如何恢复这些文件(将所有内容都还原到执行git checkout -- smdr命令之前)?


如果它们没有被提交,你最好检查本地文件所在的计算机上的垃圾箱或回收站。如果你使用的是Windows系统,在文件夹属性中有一个“以前的版本”可以恢复到(如果你开启了此功能)。 - Avantol13
@Avantol13 当你在命令行界面中删除某个东西时,通常情况下你无法在回收站中找到它们。 - edi9999
我也遇到了同样的问题...你可能会发现这个讨论很有用 https://dev59.com/CHI-5IYBdhLWcg3weoPR - jjrr
3个回答

14

使用Git无法恢复。那些文件并未被提交,因此它们不在历史记录中。你只是通过 git checkout 获取了(不存在的)版本索引。

唯一的希望是使用备份系统。


1
如果您之前曾经隐藏(并且删除)过某些内容,并且您知道这些内容本应该是隐藏的一部分,那么请尝试恢复隐藏。这样就可以至少部分地恢复被 git checkout 影响的文件。 - vallentin

6
你可以使用以下任意选项:

Git reflog

输入 git reflog 并检出所需的提交,它将“恢复”您的存储库到“已删除”的提交。

Git revert

另一种选择是使用git revert SHA-1,它将撤消您的提交。它将简单地撤销您的更改。

Git reset

Git reset将检出给定 SHA-1 的内容。它将使您的分支处于与 SHA-1 相同的状态。


但是我的本地更改没有提交?我可以使用其中之一吗? - user4076384
2
不行,所有这些命令都涉及到已提交的历史记录。 - Matthieu Moy

1
除了已接受的答案外,我发现这个好的实践可以遵循,以防止再次发生“checkout”意外。
我最看重的是这个回答中提到的。 “这里还有一个疯狂的想法:不要在脏工作树上运行'git checkout ...'。问题解决了。”
自从使用git reset命令之后,我停止了使用git checkout .来放弃任何未暂存/未提交的更改。我现在使用的命令更适合这种情况:git reset
当你绝对确定要永久丢弃更改时,请使用git resetgit reset --hardgit stash也是你的朋友,在删除之前只需将其藏起来,不会有任何损失。养成这两个习惯,仅在切换分支(大多数情况下)时使用 git checkout ,这对我非常有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接