如何使用'git reset –hard HEAD'恢复到之前的提交?
我知道Git会跟踪我对应用程序所做的更改,直到我做出更改之前,Git会保留这些更改,但这里是我挂起的地方:
当我想恢复到以前的提交时,我使用:
git reset --hard HEAD
而Git返回:
HEAD is now at 820f417 micro
然后,我如何将硬盘上的文件恢复到之前的提交状态?
我接下来的步骤是:
git add . git commit -m "revert"
但是没有一个文件在我的硬盘上发生了变化
我在做什么对错?
首先,值得注意的是, git reset --hard
是一个潜在的危险命令,因为它会抛弃所有未提交的更改。 为了安全起见,在使用之前,应该始终检查git status
的输出是否干净(即为空)。
最初你会说:
所以我知道Git会跟踪我对应用程序所做的更改,直到我提交更改为止,但是这里是我挂起的地方:
如果这揭示了一个错误的假设,我应该说这是不正确的。 Git只logging文件的状态(使用git add
)或创build提交时的状态。 一旦你创build了一个提交项目文件在一个特定的状态,他们是非常安全的,但在那之前,Git并没有真正“跟踪你的文件的变化”。 (例如,即使您使用git add
来git add
文件的新版本,也会覆盖暂存区域中该文件的先前暂存版本。)
在你的问题中,你继续问下面的问题:
当我想恢复到以前的提交我使用:git reset –hard HEAD而git返回:HEAD现在在820f417微
然后,我如何将硬盘上的文件恢复到之前的提交状态?
如果你做了git reset --hard <SOME-COMMIT>
那么Git会:
- 使您当前的分支(通常是
master
分支)回到<SOME-COMMIT>
指向的位置。 - 然后使工作树中的文件和索引(“暂存区域”)与在
<SOME-COMMIT>
提交的版本相同。
HEAD
指向你当前的分支(或者当前提交),所以git reset --hard HEAD
将会做的就是抛弃你没有提交的任何修改。
所以,假设你想要回到的好的承诺是f414f31
。 (你可以通过git log
或者任何历史浏览器find)。然后根据你想要做什么,你有几个不同的select:
- 改变你的当前分支来指向旧的提交。 你可以用
git reset --hard f414f31
来做到这git reset --hard f414f31
。 但是,这是重写你的分支的历史,所以你应该避免它,如果你已经与任何人分享这个分支。 另外,你在f414f31
之后f414f31
的提交将不再在你的master
分支的历史中。 -
创build一个与
f414f31
完全相同的代表项目状态的新提交,但只是将其添加到历史logging中,所以不会丢失任何历史logging。 你可以使用这个答案中build议的步骤来做到这一点 – 例如:git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31"
警告: git clean -f
将删除未跟踪的文件,这意味着它们没有存储在存储库中,因此它们已经消失了。 确保在执行此操作之前确实要删除所有未跟踪的文件。
试试这个,看看git clean -f
。
git reset --hard
不会删除未跟踪的文件,因为git-clean
会从跟踪的根目录中删除任何不在Git跟踪下的文件。
或者,正如@Paul Betts所说的,你应该做git clean -xdf
(当心 – 即删除所有被忽略的文件)。