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

这个问题在这里已有答案:

  • 如何将Git存储库还原为先前的提交                                     39个答案

我知道Git会跟踪我对我的应用程序所做的更改,并且它会保留给他们,直到我提交更改,但这里是我挂断的地方:

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

git reset --hard HEAD

而Git回归:

HEAD is now at 820f417 micro

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

我接下来的步骤是:

git add .
git commit -m "revert"

但我的硬盘上没有任何文件发生变化......

我在做什么是对还是错?

Brian McDonough asked 2019-03-27T03:50:13Z
2个解决方案
809 votes

首先,值得注意的是git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" 是一个具有潜在危险的命令,因为它会丢弃所有未提交的更改。 为安全起见,在使用之前,应始终检查f414f31的输出是否干净(即为空)。

最初你说以下内容:

所以我知道Git会跟踪我对我的应用程序所做的更改,并且它会保留给我们,直到我提交更改,但这里是我挂断的地方:

那是不对的。 Git仅在您暂存文件时(git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" )或创建提交时记录文件的状态。 一旦你创建了一个让你的项目文件处于特定状态的提交,它们就非常安全,但是在那之前Git并没有真正“跟踪你的文件的变化”。 (例如,即使您执行f414f31以暂存文件的新版本,也会在暂存区域中覆盖该文件的先前暂存版本。)

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

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

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

如果你做git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" 那么Git会:

  • 使您当前的分支(通常为git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" )回到f414f31
  • 然后使工作树中的文件和索引(“暂存区域”)与git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" 中提交的版本相同。

git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" 指向您当前的分支(或当前提交),因此f414f31所做的就是抛弃您拥有的任何未提交的更改。

因此,假设您要返回的良好提交是git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" .(您可以通过f414f31或任何历史记录浏览器找到它。)然后根据您要执行的操作,您可以选择几个不同的选项:

  • 将当前分支更改为指向旧提交。 您可以使用git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" 执行此操作。但是,这会重写您的分支的历史记录,因此如果您与任何人共享此分支,则应该避免使用它。 此外,您在f414f31之后所做的提交将不再在您的master分支的历史记录中。
  • 创建一个新的提交,它代表与git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31" 完全相同的项目状态,但只是将其添加到历史记录中,因此您不会丢失任何历史记录。 您可以使用此答案中建议的步骤执行此操作 - 例如:

    git reset --hard f414f31
    git reset --soft HEAD@{1}
    git commit -m "Reverting to the state of the project at f414f31"
    
Mark Longair answered 2019-03-27T03:51:54Z
162 votes

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


试试这个,看看git clean -xdf

git clean -xdf不会删除未跟踪的文件,其中git-clean将从被跟踪的根目录中删除不在Git跟踪下的任何文件。

或者,正如@Paul Betts所说,你应该做git clean -xdf(请注意 - 这也会删除所有被忽略的文件)。

uday answered 2019-03-27T03:52:39Z
translate from https://stackoverflow.com:/questions/9529078/how-do-i-use-git-reset-hard-head-to-revert-to-a-previous-commit