我要撤消此命令:

git reset HEAD~

当前回答

使用git reflog获取所有引用更新。数字重置<id_of_commit_to_which_you_want_restore>

其他回答

大多数情况下,答案都有效

git reset 'HEAD@{1}'

答案每次都有效

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

在那里,艰苦使一切保持原样。

老问题和张贴的答案很有用。不过我会补充一个选项。

git重置ORIG_HEAD

ORIG_HEAD引用HEAD先前引用的提交。

简短回答:

git reset 'HEAD@{1}'

长答案:

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

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-resetHEAD@{1}(或git-resetd27924e)。

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

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

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

这应该比一般的HEAD reflog具有更少的噪声。

我的情况略有不同,我三次重置了HEAD~。

为了撤销它,我不得不做

git reset HEAD@{3}

所以你应该能够

git reset HEAD@{N}

但如果您使用

git reset HEAD~3

你需要这样做

git reset HEAD@{1}

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

使用git reflog获取所有引用更新。数字重置<id_of_commit_to_which_you_want_restore>