1131

我知道 Git 会跟踪我对应用程序所做的更改,它会一直保存到我提交更改之前,但这是我挂断的地方:

当我想恢复到以前的提交时,我使用:

git reset --hard HEAD

Git 返回:

HEAD is now at 820f417 micro

然后,我如何将硬盘驱动器上的文件恢复到之前的提交?

我接下来的步骤是:

git add .
git commit -m "revert"

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

我在做什么对/错?

4

2 回答 2

1300

首先,始终值得注意的是这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"
    
于 2012-03-02T08:32:00.687 回答
272

警告: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. 这可以用来开始一个干净的构建。

来源:手册页

于 2012-03-02T06:48:31.897 回答