乐闻世界logo
搜索文章和话题

Git 如何撤回或者重置某次提交记录?

9 个月前提问
5 个月前修改
浏览次数62

6个答案

1
2
3
4
5
6

如果在使用git reset时发生了错误,或者后来决定撤销此操作,可以通过以下方法恢复:

  1. 使用reflog找到之前的HEAD位置:

    在Git中,reflog记录了本地仓库头部(HEAD)的变动,包括分支切换和重置操作。首先可以通过git reflog查看最近的提交历史和HEAD的变动。

    bash
    git reflog

    这将显示一系列的操作,例如:

    shell
    1a410ef HEAD@{0}: reset: moving to HEAD^ ab1afef HEAD@{1}: commit: a new commit message ...

    在这个例子中,HEAD@{1}表示git reset操作之前的HEAD位置。

  2. 重置到git reset操作之前的提交:

    使用reflog找到想要恢复的点后,可以通过git reset命令将HEAD重置到那个点。如果我们想要恢复到上面例子中的HEAD@{1},可以执行:

    bash
    git reset --hard HEAD@{1}

    这会将当前的HEAD、索引和工作目录重置到HEAD@{1}的状态。

请注意,--hard选项会使工作目录中的所有未提交的更改丢失。如果想保留这些更改,可以使用--soft或者--mixed选项,具体选择取决于你想要的更改保留级别:

  • --soft:重置HEAD到指定提交,但保留暂存区和工作目录。
  • --mixed(默认):重置HEAD和暂存区到指定提交,工作目录的更改将保留但不会暂存。

例子:

假设我不小心将我的HEAD重置到了两次提交之前,失去了我最近的工作。我可以这样恢复:

  1. 查看reflog以找到最近的提交记录:

    bash
    git reflog
  2. 假设输出显示我想要恢复的提交是abc1234,我可以执行:

    bash
    git reset --hard abc1234

    如果我想要保留工作目录中的更改,只恢复索引和HEAD,我可以使用:

    bash
    git reset --soft abc1234

在进行任何可能丢失数据的操作前,最好是先做一个备份,特别是在使用--hard选项时。这样可以确保不会无意中丢失工作成果。

2024年6月29日 12:07 回复

简短回答:

shell
git reset 'HEAD@{1}'

长答案:

Git 保留所有引用更新的日志(例如,签出、重置、提交、合并)。您可以通过输入以下内容来查看它:

shell
git reflog

此列表中的某个位置是您丢失的提交。假设您刚刚输入git reset HEAD~并想要撤消它。我的转发日志如下所示:

shell
$ git reflog 3f6db14 HEAD@{0}: HEAD~: updating HEAD d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c [...]

第一行表示HEAD0个位置之前(换句话说,当前位置)是3f6db14;它是通过重置为 获得的HEAD~。第二行表示HEAD1 个位置之前(换句话说,重置之前的状态)是 d27924e。它是通过检查特定提交获得的(尽管现在这并不重要)。因此,要撤消重置,请运行git reset HEAD@{1}(或git reset d27924e)。

另一方面,如果您从那时起运行了一些其他命令来更新 HEAD,那么您想要的提交将不会位于列表的顶部,并且您需要搜索reflog.

最后一点:查看要reflog取消重置的特定分支(例如 master)可能更容易,而不是HEAD

shell
$ git reflog show master c24138b master@{0}: merge origin/master: Fast-forward 90a2bf9 master@{1}: merge origin/master: Fast-forward [...]

这应该比一般的噪音要少HEAD reflog

2024年6月29日 12:07 回复

不过,我会提出另一种选择。

shell
git reset ORIG_HEAD

ORIG_HEAD引用之前引用的提交HEAD

2024年6月29日 12:07 回复

我的情况略有不同,我做了git reset HEAD~三次。

要撤消它我必须做

shell
git reset HEAD@{3}

所以你应该能够做到

shell
git reset HEAD@{N}

但是如果你已经使用 git Reset 完成了

shell
git reset HEAD~3

你需要做

shell
git reset HEAD@{1}

_{N}_代表 reflog 中的操作数量,正如 Mark 在评论中指出的那样。

2024年6月29日 12:07 回复
  1. 用于git reflog获取所有参考更新。

  2. git reset <id_of_commit_to_which_you_want_restore>

2024年6月29日 12:07 回复

答案大多数时候有效

shell
git reset 'HEAD@{1}'

答案每次都有效

shell
git reset --hard 'HEAD@{1}'

where--hard使得一切都和以前一样。

2024年6月29日 12:07 回复

你的答案