我知道 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 仅在您使用git add
(或使用git add
)或创建提交时记录文件的状态。一旦你创建了一个让你的项目文件处于特定状态的提交,它们就非常安全,但是在那之前 Git 并没有真正 “跟踪你的文件的变化”。 (例如,即使您执行git add
以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
做到这git reset --hard f414f31
。但是,这会重写您的分支的历史记录,所以如果您与任何人共享此分支,则应该避免使用它。此外,您在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"
警告:
git clean -f
将删除未跟踪的文件,这意味着它们已经消失,因为它们没有存储在存储库中。在执行此操作之前,请确保您确实要删除所有未跟踪的文件。
试试这个,看看git clean -f
。
git reset --hard
不会删除未跟踪的文件,因为git-clean
将从被跟踪的根目录中删除不在 Git 跟踪下的任何文件。
另外,正如 @Paul Betts 所说,你可以做到这一点(请注意 - 这也会删除所有被忽略的文件)
git clean -df
git clean -xdf
小心!这也将删除被忽略的文件