首页 文章

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

提问于
浏览
713

这个问题在这里已有答案:

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

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

git reset --hard HEAD

而Git回归:

HEAD is now at 820f417 micro

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

我接下来的步骤是:

git add .
git commit -m "revert"

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

我在做什么是对还是错?

2 回答

  • 815

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

    最初你说以下内容:

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

    那是不对的 . Git只记录文件的状态(使用 git add )或创建提交时 . 一旦你've created a commit which has your project files in a particular state, they'非常安全,但在那之前Git并不是真的"tracking changes"你的文件 . (例如,即使您执行 git add 以暂存文件的新版本,也会在暂存区域中覆盖该文件的先前暂存版本 . )

    在您的问题中,您继续询问以下内容:

    当我想恢复到之前的提交时,我使用:git reset --hard HEAD并且git返回:HEAD现在处于820f417 micro我如何将我的硬盘驱动器上的文件还原回之前的提交?

    如果你做 git reset --hard <SOME-COMMIT> 那么Git会:

    • 使当前分支(通常为 master )返回 <SOME-COMMIT> 点 .

    • 然后使工作树中的文件和索引("staging area")与 <SOME-COMMIT> 中提交的版本相同 .

    HEAD 指向您当前的分支(或当前提交),因此 git reset --hard HEAD 所做的就是抛弃您拥有的任何未提交的更改 .

    所以,假设您想要返回的良好提交是 f414f31 . (您可以通过 git log 或任何历史记录浏览器找到它 . )然后,您可以根据自己的具体操作选择一些不同的选项:

    • 将当前分支更改为指向旧提交 . 你可以用 git reset --hard f414f31 做到这一点 . 但是,这会重写您的分支的历史记录,因此如果您与任何人共享此分支,则应该避免使用它 . 此外,您在 f414f31 之后所做的提交将不再出现在 master 分支的历史记录中 .

    • 创建一个新的提交,它代表与 f414f31 完全相同的项目状态,但只是将其添加到历史记录中,因此您不会丢失任何历史记录 . 您可以使用this answer中建议的步骤执行此操作 - 类似于:

    git reset --hard f414f31
    git reset --soft HEAD@{1}
    git commit -m "Reverting to the state of the project at f414f31"
    
  • 162

    WARNING: git clean -f will remove untracked files, meaning they're gone for good since they aren't stored in the repository. Make sure you really want to remove all untracked files before doing this.


    试试这个,看看 git clean -f .

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

    或者,正如@Paul Betts所说,你应该做 git clean -xdf (请注意 - 这也会删除所有被忽略的文件) .

相关问题