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

要恢复到以前的提交,我使用:

$ git reset --hard HEAD

HEAD is now at 820f417 micro

然后我如何将我的硬盘上的文件恢复到以前的提交?

我接下来的步骤是:

git add .
git commit -m "revert"

但是我硬盘上的文件都没有改变…


当前回答

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

一开始你这样说:

因此,我知道Git会跟踪我对应用程序所做的更改,并在我提交更改之前一直保留这些更改,但这就是我所困扰的地方:

这是不正确的。Git只记录文件在运行时(使用Git add)或创建提交时的状态。一旦你创建了一个让你的项目文件处于特定状态的提交,它们就非常安全了,但在此之前Git不会真正“跟踪”你文件的更改。(例如,即使你添加了一个新版本的文件,也会在暂存区覆盖该文件之前的暂存版本。)

在你的问题中,你可以继续问以下问题:

当我想恢复到以前的提交时,我使用:git reset——hard HEAD和git返回:HEAD现在在820f417 micro 然后我如何将我的硬盘上的文件恢复到以前的提交?

如果你执行git reset——hard <SOME-COMMIT>, git会:

使您的当前分支(通常是master)返回到<SOME-COMMIT>。 然后使工作树和索引(“staging区域”)中的文件与<SOME-COMMIT>中提交的版本相同。

HEAD指向你当前的分支(或当前的提交),所以所有git重置——hard HEAD将会做的是扔掉你所有未提交的更改。

假设你想要返回的提交是f414f31。(你可以通过git日志或任何历史浏览器找到它。)然后你有几个不同的选择,这取决于你想做什么:

Change your current branch to point to the older commit instead. You could do that with git reset --hard f414f31. However, this is rewriting the history of your branch, so you should avoid it if you've shared this branch with anyone. Also, the commits you did after f414f31 will no longer be in the history of your master branch. Create a new commit that represents exactly the same state of the project as f414f31, but just adds that on to the history, so you don't lose any history. You can do that using the steps suggested in this answer - something like: git reset --hard f414f31 git reset --soft HEAD@{1} git commit -m "Reverting to the state of the project at f414f31"

其他回答

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

一开始你这样说:

因此,我知道Git会跟踪我对应用程序所做的更改,并在我提交更改之前一直保留这些更改,但这就是我所困扰的地方:

这是不正确的。Git只记录文件在运行时(使用Git add)或创建提交时的状态。一旦你创建了一个让你的项目文件处于特定状态的提交,它们就非常安全了,但在此之前Git不会真正“跟踪”你文件的更改。(例如,即使你添加了一个新版本的文件,也会在暂存区覆盖该文件之前的暂存版本。)

在你的问题中,你可以继续问以下问题:

当我想恢复到以前的提交时,我使用:git reset——hard HEAD和git返回:HEAD现在在820f417 micro 然后我如何将我的硬盘上的文件恢复到以前的提交?

如果你执行git reset——hard <SOME-COMMIT>, git会:

使您的当前分支(通常是master)返回到<SOME-COMMIT>。 然后使工作树和索引(“staging区域”)中的文件与<SOME-COMMIT>中提交的版本相同。

HEAD指向你当前的分支(或当前的提交),所以所有git重置——hard HEAD将会做的是扔掉你所有未提交的更改。

假设你想要返回的提交是f414f31。(你可以通过git日志或任何历史浏览器找到它。)然后你有几个不同的选择,这取决于你想做什么:

Change your current branch to point to the older commit instead. You could do that with git reset --hard f414f31. However, this is rewriting the history of your branch, so you should avoid it if you've shared this branch with anyone. Also, the commits you did after f414f31 will no longer be in the history of your master branch. Create a new commit that represents exactly the same state of the project as f414f31, but just adds that on to the history, so you don't lose any history. You can do that using the steps suggested in this answer - something like: 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跟踪下的任何文件。

或者,您可以执行以下操作(但要注意-这也会删除所有被忽略的文件)

Git clean -df git clean -xdf小心!这也将删除被忽略的文件

旗帜的解释:

-d会递归删除目录下的所有文件

-f

如果Git配置变量clean。requireForce未设置为 False, git clean将拒绝删除文件或目录,除非 给定-f或-i。Git将拒绝修改未跟踪的嵌套Git 存储库(带有.git子目录的目录),除非有第二个-f 是给定的。

-x不使用标准的忽略规则,而是使用-e指定的规则。这可以用来启动一个干净的构建。

来源:Man页面