如何使用'git reset –hard HEAD'恢复到之前的提交?

我知道Git会跟踪我对应用程序所做的更改,直到我做出更改之前,Git会保留这些更改,但这里是我挂起的地方:

当我想恢复到以前的提交时,我使用:

git reset --hard HEAD 

而Git返回:

 HEAD is now at 820f417 micro 

然后,我如何将硬盘上的文件恢复到之前的提交状态?

我接下来的步骤是:

 git add . git commit -m "revert" 

但是没有一个文件在我的硬盘上发生了变化

我在做什么对错?

首先,值得注意的是, git reset --hard是一个潜在的危险命令,因为它会抛弃所有未提交的更改。 为了安全起见,在使用之前,应该始终检查git status的输出是否干净(即为空)。

最初你会说:

所以我知道Git会跟踪我对应用程序所做的更改,直到我提交更改为止,但是这里是我挂起的地方:

如果这揭示了一个错误的假设,我应该说这是不正确的。 Git只logging文件的状态(使用git add )或创build提交时的状态。 一旦你创build了一个提交项目文件在一个特定的状态,他们是非常安全的,但在那之前,Git并没有真正“跟踪你的文件的变化”。 (例如,即使您使用git addgit add文件的新版本,也会覆盖暂存区域中该文件的先前暂存版本。)

在你的问题中,你继续问下面的问题:

当我想恢复到以前的提交我使用:git reset –hard HEAD而git返回:HEAD现在在820f417微

然后,我如何将硬盘上的文件恢复到之前的提交状态?

如果你做了git reset --hard <SOME-COMMIT>那么Git会:

  • 使您当前的分支(通常是master分支)回到<SOME-COMMIT>指向的位置。
  • 然后使工作树中的文件和索引(“暂存区域”)与在<SOME-COMMIT>提交的版本相同。

HEAD指向你当前的分支(或者当前提交),所以git reset --hard HEAD将会做的就是抛弃你没有提交的任何修改。

所以,假设你想要回到的好的承诺是f414f31 。 (你可以通过git log或者任何历史浏览器find)。然后根据你想要做什么,你有几个不同的select:

  • 改变你的当前分支来指向旧的提交。 你可以用git reset --hard f414f31来做到这git reset --hard f414f31 。 但是,这是重写你的分支的历史,所以你应该避免它,如果你已经与任何人分享这个分支。 另外,你在f414f31之后f414f31的提交将不再在你的master分支的历史中。
  • 创build一个与f414f31完全相同的代表项目状态的新提交,但只是将其添加到历史logging中,所以不会丢失任何历史logging。 你可以使用这个答案中build议的步骤来做到这一点 – 例如:

     git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" 

警告: git clean -f将删除未跟踪的文件,这意味着它们没有存储在存储库中,因此它们已经消失了。 确保在执行此操作之前确实要删除所有未跟踪的文件。


试试这个,看看git clean -f

git reset --hard不会删除未跟踪的文件,因为git-clean会从跟踪的根目录中删除任何不在Git跟踪下的文件。

或者,正如@Paul Betts所说的,你应该做git clean -xdf (当心 – 即删除所有被忽略的文件)。