如何使用”git reset–hard head”恢复到以前的提交?

How do I use 'git reset --hard HEAD' to revert to a previous commit?

本问题已经有最佳答案,请猛点这里访问。

我知道Git会跟踪我对我的应用程序所做的更改,在我提交这些更改之前,它会一直保存这些更改,但这里是我挂断的地方:

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

1
git reset --hard HEAD

Git返回:

1
HEAD is now at 820f417 micro

然后如何将硬盘上的文件还原回以前的提交?

我接下来的步骤是:

1
2
git add .
git commit -m"revert"

但是我的硬盘上没有任何文件被更改…

我在做什么对/错?


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

最初你会说:

So I know that Git tracks changes I make to my application, and it holds on to them until I commit the changes, but here's where I'm hung up:

不正确。Git只在您准备文件(使用git add)或创建提交时记录文件的状态。一旦您创建了一个提交,它使您的项目文件处于特定的状态,它们就非常安全了,但是在此之前,Git并没有真正"跟踪"您的文件的更改。(例如,即使执行git add以准备文件的新版本,也会覆盖临时区域中该文件的先前阶段版本。)

在您的问题中,然后继续问以下问题:

When I want to revert to a previous commit I use: git reset --hard HEAD And git returns: HEAD is now at 820f417 micro

How do I then revert the files on my hard drive back to that previous commit?

如果您执行git reset --hard ,那么git将:

  • 使您当前的分支(通常为master)返回到处。
  • 然后使工作树和索引("临时区域")中的文件与中提交的版本相同。

HEAD指向您当前的分支(或当前提交),所以git reset --hard HEAD所要做的就是丢弃您所拥有的任何未提交的更改。

所以,假设你想回到的好承诺是f414f31。(您可以通过git log或任何历史浏览器找到这一点。)然后,您可以根据具体需要选择几个不同的选项:

  • 将当前分支改为指向较旧的提交。你可以用git reset --hard f414f31来做。但是,这是在重写分支的历史,因此如果您与任何人共享了这个分支,那么应该避免使用它。而且,你在f414f31之后所做的承诺将不再出现在你的master分支机构的历史中。
  • 创建一个与f414f31完全相同的项目状态的新提交,但只是将其添加到历史记录中,这样就不会丢失任何历史记录。您可以使用此答案中建议的步骤来执行此操作-例如:

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


WARNING: git clean -f will remove untracked files, meaning they're gone for good since they aren't stored in the repository. Make sure you really want to remove all untracked files before doing this.

试试看git clean -f

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

或者,正如@paul betts所说,您可以这样做(但请注意,这也会删除所有被忽略的文件)

  • git clean -df
  • git clean -xdf小心!这还将删除被忽略的文件