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

git reset --hard HEAD
HEAD is now at 820f417 micro
git add .
git commit -m "revert"

答案

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

最初,您说以下内容:

因此,我知道 Git 会跟踪我对应用程序所做的更改,它会一直保留到它们,直到我提交更改为止,但这是我挂断的地方:

那是不对的。 Git 仅在git add文件(使用git add )或创建提交时记录文件的状态。一旦创建了一个使项目文件处于特定状态的提交,它们就非常安全,但是直到那时 Git 才真正对文件进行 “跟踪更改”。 (例如,即使您执行git addgit add文件的新版本,也将覆盖暂存区域中该文件的先前暂存的版本。)

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

当我想恢复到以前的提交时,我使用:git reset --hard HEAD 并且 git 返回:HEAD 现在位于 820f417 micro

然后,如何将硬盘驱动器上的文件还原到先前的提交?

如果您执行git reset --hard <SOME-COMMIT>则 Git 将执行以下操作:

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

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

因此,假设您要返回的良好提交是f414f31 。 (您可以通过git log或任何历史记录浏览器找到它。)然后,根据您要执行的操作,您有几个不同的选项:

  • 更改您当前的分支以指向较早的提交。您可以使用git reset --hard f414f31做到这git reset --hard f414f31 。但是,这是在重写分支的历史记录,因此,如果您已与任何人共享此分支,则应避免使用它。同样,在f414f31之后f414f31的提交将不再在master分支的历史记录中。
  • 创建一个新的提交,该提交表示与f414f31完全相同的项目状态,但只需将其添加到历史记录中,这样就不会丢失任何历史记录。您可以使用此答案中建议的步骤进行操作 - 类似:

    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 -df
  • git clean -xdf 注意!这也会删除忽略的文件