如何使用"git reset --hard HEAD"返回到以前的提交?
如何使用"git reset --hard HEAD"返回到以前的提交?
这个问题已经有答案了:
我知道Git跟踪我对应用程序所做的更改,并将它们保留直到我提交更改。
为了还原到以前的提交,我使用了:
$ git reset --hard HEAD HEAD is now at 820f417 micro
那么我如何将硬盘上的文件还原回那个先前的提交?
我的下一步是:
git add . git commit -m "revert"
但是我的硬盘上没有任何文件发生变化...
警告:
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
指定的规则. 这可以用于启动一个全新的构建.
来源: 手册页
首先,值得注意的是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"