如何撤消'git reset'?


1310

撤消最简单的方法是什么

git reset HEAD~

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


2
如果有人在寻找如何撤消硬重置,请签入撤消git reset --hard HEAD〜1。解决方案非常相似。


2
这与有关的问题不是重复的--hard!意外运行此命令的风险要高得多。例如,您想使用取消暂存单个文件git reset foo-file。您只写文件名的第一部分,点击选项卡以自动完成,它实际上完成为分支名称,您没有注意到它,git reset foo-branch而是运行命令。瞧
有信鹫

Answers:


2385

简短答案:

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
[...]

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

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

最后一点:在主reflog分支上,您可以更轻松地查看要取消重置的特定分支的,而不是HEAD

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

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


24
作为一种更直观,更美观的替代方法reflog,我喜欢使用git log --graph --decorate --oneline $(git rev-list -g --all)。它显示了所有提交的树,包括悬空的未命名分支
texasflood 2015年

1
可以说我有一个包含现有文件的目录。在此目录中运行git init,然后运行git reset --hard。没有reflog,甚至没有任何日志开始。这些文件现在很敬酒吗?
AlanSE 2015年

@AlanSE,据我所知,这些文件是吐司。如果您从未做过git add(即从未上过该文件的该版本),则git checkoutgit reset --hard将删除没有备份的唯一副本(工作目录)。我希望没有。
Mark Lodato

2
git reset HEAD~12糟糕..... git reset HEAD@{12}''git reflog'进行救援!哦,就是git reset HEAD@{1}
丹尼斯(Dennis)

阅读了出色的git-scm.com/blog/2011/07/11/reset.html git-reset文章之后,我有点不解了。
Andriy Drozdyuk '16

192

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

git reset ORIG_HEAD

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


1
这看起来很棒–您能否详细说明?这里的“ ORIG”是“原始”还是“原始”的缩写?…也就是说,它会重置为HEAD之前开始移动的位置吗?还是HEAD在原点上?如果您在HEAD之前将HEAD移动了几次,会发生什么git reset ORIG_HEAD?谢谢。
约翰

ORIG代表原始,ORIG_HEAD表示原始HEAD,在重置之前
Sam Gallagher

“某些操作(例如合并和重置)会在将HEAD的先前版本记录到ORIG_HEAD之前,将其调整为新值。您可以使用ORIG_HEAD来恢复或还原为先前的状态或进行比较。” 书摘录:“使用Git进行版本控制”
Amirreza

56

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

要撤消它,我必须做

git reset HEAD@{3}

所以你应该能够做

git reset HEAD@{N}

但是如果您使用git reset

git reset HEAD~3

你需要做

git reset HEAD@{1}

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


2
接受的选项未提供前进的示例NI在一个小时前遇到的情况是我想转发1个以上。想要在这里添加。对于使用git reset
HEAD〜3

3
但是,如果有人完成了git reset HEAD〜3,他很快就会知道如何撤消它,则无需进入reflog便需要git reset HEAD @ {3} git reset
HEAD〜3

1
我认为任何看到{1} / {2}的人都会意识到该数字可以是该reflog命令为您提供的任何修订号。同意您关于两个方向〜3 / @ {3}上的数字相同的观点,但实际上并不需要成为一个新答案。
2014年

30

1. git reflog用于获取所有参考文献的更新。

2。git reset <id_of_commit_to_which_you_want_restore>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.