如何使用"git reset --hard HEAD"返回到以前的提交?

20 浏览
0 Comments

如何使用"git reset --hard HEAD"返回到以前的提交?

这个问题已经有答案了:

如何将Git仓库还原到先前的提交?

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

为了还原到以前的提交,我使用了:

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

那么我如何将硬盘上的文件还原回那个先前的提交?

我的下一步是:

git add .
git commit -m "revert"

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

警告: 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 子目录的目录)除非给出第二个-f参数,否则Git将拒绝修改它们.

-x 不使用标准的忽略规则, 而使用由 -e指定的规则. 这可以用于启动一个全新的构建.

来源: 手册页

0
0 Comments

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

首先您说:

所以我知道Git跟踪我对应用程序所做的更改,并在我提交更改之前保存它们,但是我的问题在于:

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

然后在您的问题中,您问:

当我想要恢复到先前的提交时,我使用:git reset --hard HEAD 然后git返回:HEAD现在位于820f417微

然后我如何将硬盘上的文件还原回到那个先前的提交?

如果您使用git reset --hard ,那么Git会:

  • 将您当前分支(通常为master)退回到指向
  • 然后使工作树中的文件和索引(“暂存区”)与在中提交的版本相同。

HEAD指向您当前的分支(或当前提交),因此git reset --hard HEAD的作用只是扔掉您尚未提交的更改。

所以,假设您想要返回的好提交是f414f31。(您可以通过git log或任何历史浏览器查找)然后,根据您要执行的操作不同,您有一些不同的选项:

  • 将当前分支更改为指向旧提交。您可以使用git reset --hard 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"
    

0