如何撤消'git reset'?

撤消最简单的方法是什么

git reset HEAD~

命令?目前,我能想到的唯一方法是从远程存储库执行 “git clone http:// ...”。

答案

简短答案:

git reset 'HEAD@{1}'

长答案:

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

git reflog

此列表中的某处是您丢失的提交。假设您刚刚输入git reset HEAD~并想要撤消它。我的 reflog 看起来像这样:

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

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

另一方面,如果在更新 HEAD 之后再运行其他命令,则所需的提交将不在列表的顶部,并且您需要搜索reflog

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

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

与普通的HEAD reflog相比,它应具有更少的噪声。

旧问题,发布的答案效果很好。不过,我会选择另一种选择。

git reset ORIG_HEAD

ORIG_HEAD引用了HEAD之前引用的提交。

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

要撤消它,我必须做

git reset HEAD@{3}

所以你应该能够做

git reset HEAD@{N}

但是如果您使用 git reset

git reset HEAD~3

你将需要做

git reset HEAD@{1}

由于 {N} 表示 Reflog 中的操作数。正如 Mark 在评论中指出的那样。

1. 使用git reflog获取所有引用更新。

2. git reset <id_of_commit_to_which_you_want_restore>