【问题标题】:How do I use 'git reset --hard HEAD' to revert to a previous commit? [duplicate]如何使用 'git reset --hard HEAD' 恢复到以前的提交? [复制]
【发布时间】:2012-03-20 16:58:26
【问题描述】:

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

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

git reset --hard HEAD

然后 Git 返回:

HEAD is now at 820f417 micro

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

我接下来的步骤是:

git add .
git commit -m "revert"

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

我在做什么对/错?

【问题讨论】:

  • 将我硬盘上的文件恢复到之前的提交是什么意思?如果 820f417 是您想要的提交,那么文件现在应该具有该提交中的确切内容。
  • 如果要撤消所有更改,在git reset --hard 之后,您应该git checkout <branch>
  • 我真的不明白 [重复] 然后问一个新问题,当答案不令人满意时。就更多的重复而言,这是灾难的秘诀......

标签: git head git-reset git-revert


【解决方案1】:

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


试试这个看看git clean -f

git reset --hard 不会删除未跟踪的文件,而git-clean 将删除所有不在 Git 跟踪下的跟踪根目录中的文件。

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

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

标志说明:

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

-f

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

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

来源:Man pages

【讨论】:

  • 这是迄今为止我遇到的第一个不可逆转的 git 命令...添加了一个警告,这样其他人就不会太高兴了...
  • 首先使用 n 而不是 f,以查看将要删除的内容的列表,例如:git clean -xdn
  • 记住要小心清理,因为 git clean -f 将删除任何环境/gui项目文件夹(例如 .idea (phpstorm) 或 .vagrant (vagrant))
  • 该死的,git clean -xdf 甚至删除了所有被忽略的文件!!!
  • git clean -df 就足够了。 -x 标志忽略 .gitignore 文件。
【解决方案2】:

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

一开始你是这样说的:

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

这是不正确的。 Git 仅在您暂存文件(使用git add)或创建提交时记录文件的状态。一旦你创建了一个让你的项目文件处于特定状态的提交,它们就非常安全,但在那之前,Git 并没有真正“跟踪”你的文件的更改。 (例如,即使您使用git 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 所做的就是丢弃您拥有的任何未提交的更改。

因此,假设您想要返回的良好提交是 f414f31。 (您可以通过git log 或任何历史浏览器找到它。)然后您有几个不同的选项,具体取决于您想要做什么:

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

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

【讨论】:

  • git reset --soft HEAD@{1} 真的搞砸了我的本地存储库。它认为所有文件现在都在。我现在该怎么办?
  • @Mark Longair:你最后指出的答案不是用户 --hard,而是简单的 git reset。
  • @MiniQuark:我正在使用我在链接答案的 cmets 中建议的等效且稍短的变体。
  • 感谢git reset --soft HEAD@{1} 的提示。即使我在 git 方面经验丰富,我也没有想过这种恢复提交的方式。
  • 如果git log 没有立即显示您希望恢复到的相关提交,也可以咨询git reflog
猜你喜欢
  • 2013-01-17
  • 1970-01-01
  • 2011-08-19
  • 2019-08-26
  • 2011-08-12
  • 2020-05-04
  • 2018-01-13
  • 2022-11-30
相关资源
最近更新 更多