我该如何撤销这个命令?
git reset HEAD~
git reset 'HEAD@{1}'
Git会记录所有引用更新的日志(例如:checkout、reset、commit、merge)。您可以通过输入以下命令查看它:
git reflog
在这个列表中有一个丢失的提交。假设你刚刚输入了git reset HEAD~
并想要撤销它。我的reflog看起来像这样:
$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]
第一行代码表示当前位置(即0个位置之前)为3f6db14,是由重置到HEAD~
得到的。第二行代码表示当前位置往前一个位置(即重置前的状态)为d27924e。虽然这个过程中使用了特定的提交,但现在并不重要。因此,要撤销重置,请运行git reset HEAD@{1}
(或git reset d27924e
)。
另外,如果您在此之后运行了其他命令来更新HEAD
,那么您想要的提交可能不在列表顶部,您需要通过reflog
进行搜索。
最后注意:查看特定分支(例如master)的reflog
可能比查看HEAD
更容易找回要撤销的提交。
$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]
这应该比通常的 HEAD reflog
更少噪音。
git init
,然后紧接着运行 git reset --hard
。没有 reflog,甚至没有任何日志可供参考。这些文件现在基本上已经无法恢复了吗? - AlanSEgit reset HEAD@{1}
--> 原来只需要使用git reset HEAD@{1}命令即可。 - Dennisfatal: ambiguous argument ''HEAD@{1}'': unknown revision or path not in the working tree.
通过省略围绕着 HEAD@{1}
的引号解决了这个问题。 - Tom Ladekgit reset --soft HEAD~1
,并且在运行 git reset 'HEAD@{1}'
后,暂存区也是干净的。 - fstang这是一个老问题,之前发布的答案都很好用。我想提供另外一种选择。
git reset ORIG_HEAD
ORIG_HEAD
是指向之前 HEAD
所指的那个提交。
git reset ORIG_HEAD
之前已经多次移动了HEAD,会发生什么?谢谢。 - BenjohnHEAD@{1}
始终是HEAD的先前值,而ORIG_HEAD
是选择命令后HEAD的先前值。 - studgeek我的情况稍有不同,我执行了git reset HEAD~
三次。
要撤消它,我必须进行以下操作
git reset HEAD@{3}
所以您应该能够做到
git reset HEAD@{N}
但是如果你已经使用了 git reset
git reset HEAD~3
你需要做的事情
git reset HEAD@{1}
{N}代表reflog中的操作数量,正如Mark在评论中指出的那样。
reflog
命令可以提供给您。同意你关于这些数字在 ~3 / @{3} 中对于任一方向都相同的观点,但并不需要成为一个新答案。 - Clint使用 git reflog
命令获取所有更新的引用。
git reset <您想要还原的提交的id>
答案大部分时间有效
git reset 'HEAD@{1}'
答案总是有效的
git reset --hard 'HEAD@{1}'
使用--hard
参数会使所有内容保持与之前相同。
--hard
相关问题的重复!意外执行此命令的风险要高得多。例如,您想使用git reset foo-file
取消暂存单个文件。您只写了文件名的前半部分,按tab键进行自动完成,它实际上完成了一个分支名称,您没有注意到并运行了git reset foo-branch
命令。就这样。 - Yushin Washio