我知道 Git 会跟踪我对应用程序所做的更改,它会一直保存到我提交更改之前,但这是我挂断的地方:
当我想恢复到以前的提交时,我使用:
git reset --hard HEAD
Git 返回:
HEAD is now at 820f417 micro
然后,我如何将硬盘驱动器上的文件恢复到之前的提交?
我接下来的步骤是:
git add .
git commit -m "revert"
但是我硬盘上的文件都没有改变...
我在做什么对/错?
我知道 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 并没有真正“跟踪”你的文件的更改。(例如,即使您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
,但只是将其添加到历史记录中,因此您不会丢失任何历史记录。您可以使用此答案中建议的步骤来执行此操作- 例如:
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
不会删除未跟踪的文件,而 asgit-clean
将从跟踪的根目录中删除不在 Git 跟踪下的任何文件。
或者,正如@Paul Betts 所说,你可以这样做(但要注意 - 这也会删除所有被忽略的文件)
git clean -df
git clean -xdf
警告!这也将删除被忽略的文件标志说明:
-d
递归删除目录中的所有文件
-f
如果 Git 配置变量 clean.requireForce 没有设置为 false,git clean 将拒绝删除文件或目录,除非给出 -f 或 -i。除非给出第二个 -f,否则 Git 将拒绝修改未跟踪的嵌套 git 存储库(带有 .git 子目录的目录)。
-x
不要使用标准的忽略规则,而是使用-e
. 这可以用来开始一个干净的构建。
来源:手册页