我如何使用“git重置-硬头”恢复到以前的提交?

我知道Git会跟踪我对应用程序所做的更改,并保留它们,直到我提交更改。

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

$ git reset --hard HEAD
HEAD is now at 820f417 micro

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

我的下一步是:

git add .git commit -m "revert"

但我硬盘上的文件都没有改变…

3995843 次浏览

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


试试这个,看看git clean -f

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

或者,您可以执行以下操作(但要注意-这也会删除所有被忽略的文件)

  • git clean -df
  • git clean -xdf注意!这也会删除忽略的文件

旗帜说明:

-d递归删除目录中的所有文件

-f

如果Git配置变量clean.requireForce未设置为false,git Clean将拒绝删除文件或目录,除非给定-f或-i。Git将拒绝修改未跟踪的嵌套git存储库(具有. git子目录的目录),除非第二个-f

-x不要使用标准忽略规则,而是使用-e指定的规则。这可以用来启动一个干净的构建。

来源:手册页

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

最初你说以下内容:

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

这是不正确的。Git仅在您暂存(使用git add)或创建提交时记录文件的状态。一旦您创建了具有特定状态的项目文件的提交,它们就非常安全,但在此之前Git并不真正“跟踪”文件的更改。(例如,即使您使用git add暂存文件的新版本,也会覆盖暂存区域中该文件的先前暂存版本。)

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

当我想恢复到以前的提交时,我使用:git重置--hard HEAD和git返回:HEAD现在是820f417 micro

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

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

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

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

所以,假设你想要返回的好提交是f414f31。(你可以通过git log或任何历史浏览器找到它。)然后,根据你想要做的事情,你有一些不同的选择:

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

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