如何撤消“git重置”?

我想撤消这个命令:

git reset HEAD~
752382 次浏览

简短的回答:

git reset 'HEAD@{1}'

很长的回答:

Git保留所有ref更新(例如,签出、重置、提交、合并)的日志。您可以通过键入:

git reflog

此列表中的某个地方是您丢失的提交。假设您刚刚键入git reset HEAD~并想撤消它。我的reflg如下所示:

$ git reflog3f6db14 HEAD@{0}: HEAD~: updating HEADd27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c[...]

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

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

最后一个注意事项:查看要取消重置的特定分支的reflog可能更容易,例如master,而不是HEAD

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

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

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

为了撤销它我不得不这么做

git reset HEAD@{3}

所以你应该能做到

git reset HEAD@{N}

但是,如果您使用Git重置

git reset HEAD~3

你需要做

git reset HEAD@{1}

正如Mark在注释中指出的那样,{N}表示reflg中的操作数量。

老问题,和发布的答案工作得很好。我将与另一个选项,虽然插话。

git reset ORIG_HEAD

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

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

  2. git reset <id_of_commit_to_which_you_want_restore>

答案大部分时间有效

git reset 'HEAD@{1}'

答案每次都有效

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

其中--hard使一切保持与以前相同。