如何使用'git reset --hard HEAD'恢复到之前的提交?

Bri*_*ugh 898 git head git-revert git-reset

我知道Git会跟踪我对我的应用程序所做的更改,并且它会保留给他们,直到我提交更改,但这里是我挂断的地方:

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

git reset --hard HEAD
Run Code Online (Sandbox Code Playgroud)

而Git回归:

HEAD is now at 820f417 micro
Run Code Online (Sandbox Code Playgroud)

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

我接下来的步骤是:

git add .
git commit -m "revert"
Run Code Online (Sandbox Code Playgroud)

但我的硬盘上没有任何文件发生变化......

我在做什么是对还是错?

Mar*_*air 1029

首先,值得注意的是,这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"
    
    Run Code Online (Sandbox Code Playgroud)

  • 感谢关于`git reset --soft HEAD @ {1}`的提示.我没有想过恢复提交的方式,即使我在git中经验丰富. (5认同)
  • 如果`git log`没有立即显示你想要恢复的相关提交,也可以咨询`git reflog`. (5认同)
  • @MiniQuark:我正在使用我在链接答案的评论中建议的等效且稍短的变体. (3认同)
  • @Mark Longair:最后指向的答案不是用户--hard,而是简单的git reset。 (2认同)

uda*_*day 210

警告:git clean -f将删除未跟踪的文件,这意味着它们已经消失,因为它们未存储在存储库中.在执行此操作之前,请确保您确实要删除所有未跟踪的文件.


试试看,看看git clean -f.

git reset --hard不会删除未跟踪的文件,其中git-clean将从跟踪的根目录中删除不在Git跟踪下的任何文件.

另外,正如@Paul Betts所说,你可以做到这一点(请注意 - 这也会删除所有被忽略的文件)

  • git clean -df
  • git clean -xdf 警告!这也将删除被忽略的文件

  • **Goddamnit,`git clean -xdf`甚至删除所有被忽略的文件!!!** (89认同)
  • 首先使用**n**代替**f**,查看将要删除的内容列表,例如:`git clean -xdn` (23认同)
  • 这是我到目前为止遇到的第一个git命令,它是不可逆转的...添加了一个警告,以便其他人不要太开心...... (12认同)
  • `git clean -df就足够了.`-x`标志忽略`.gitignore`文件. (7认同)
  • 记得要小心干净,因为git clean -f会删除所有环境/ gui项目文件夹(例如.idea(phpstorm)或.vagrant(vagrant)) (6认同)
  • @BrianMcDonough - 一个非常常见的声明.我用git犯了这么多错误只是因为我不理解它,而且它需要增加的时间超出了我能承受的范围.我主要使用它作为接近SVN,因为我可以使用大量的个人备份.上帝禁止git专家在我的电脑上"修复那个烂摊子". (4认同)
  • 这是我从终端获得的:**不删除app/views/relationships /不删除tmp/sessions /不删除tmp/sockets/**没有变化.嗯......我做的每件事似乎都行不通.不是你的错. (2认同)