如何撤消“git重置”?

Posted

技术标签:

【中文标题】如何撤消“git重置”?【英文标题】:How to undo 'git reset'? 【发布时间】:2021-11-03 15:46:35 【问题描述】:

最简单的撤消方法是什么:

git reset HEAD~

目前,我能想到的唯一方法是从远程仓库执行git clone http://...

【问题讨论】:

如果有人在寻找如何撤消硬重置,请查看Undoing a git reset --hard HEAD~1。解决方案非常相似。 How can I undo git reset --hard HEAD~1?的可能重复 这不是与--hard相关的问题的重复!意外运行此命令的风险要高得多。例如,您想使用git reset foo-file 取消暂存单个文件。你只写文件名的第一部分,点击自动补全选项卡,它实际上完成了一个分支名称,你没有注意到它,而是运行命令git reset foo-branch。瞧 【参考方案1】:

简答:

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 reset HEAD@1(或 git reset d27924e)。

另一方面,如果你在更新 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 有更少的噪音。

【讨论】:

作为reflog 的更直观和更好的替代品,我喜欢使用git log --graph --decorate --oneline $(git rev-list -g --all)。它显示了所有提交的树,包括悬空的未命名分支 假设我有一个目录,其中包含现有文件。在这个目录中,我运行git init,然后紧接着git reset --hard。没有 reflog,甚至没有任何日志开始。这些文件现在差不多了吗? @AlanSE,遗憾的是,据我所知,这些文件都是吐司。如果您从未完成过git add(即从未暂存该版本的文件),那么git checkoutgit reset --hard 将删除没有备份的唯一副本(工作目录)。我希望它没有。 git reset HEAD~12 哎呀... git reset HEAD@12 nooo .. 'git reflog' 来救援!哦,这只是git reset HEAD@1 尝试“简答”(复制和粘贴),我得到了以下错误:fatal: ambiguous argument ''HEAD@1'': unknown revision or path not in the working tree. 通过省略HEAD@1 周围的引号解决。【参考方案2】:

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

要撤消它,我必须这样做

git reset HEAD@3

所以你应该可以做到

git reset HEAD@N

但是如果你已经使用 git reset 完成了

git reset HEAD~3

你需要做的

git reset HEAD@1

N 表示 reflog 中的操作数,正如 Mark 在 cmets 中指出的那样。

【讨论】:

accepted 选项没有提供前进的示例 N 我在一小时前的情况下,我想转发超过 1 个。尝试了多个并且它有效。想在这里添加。对于使用 git reset HEAD~3 寻找撤消重置的人来说很有用 但是如果有人已经完成了 git reset HEAD~3 他可以快速看到如何撤消它, git reset HEAD@3 不需要进入 reflog git reset HEAD~3 等是一个常见情况 我认为任何看到 1 / 2 的人都会意识到该数字可以是任何修订号,reflog 命令为您提供。同意您关于两个方向的数字相同的观点 ~3 / @3 但并不需要成为新的答案。【参考方案3】:

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

git reset ORIG_HEAD

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

【讨论】:

这看起来很棒——你能详细说明一下吗?这里的“ORIG”是“original”还是“origin”的缩写? ......即,它是否重置到 HEAD 在开始使用它之前的位置?或者 HEAD 在哪里?如果您在git reset ORIG_HEAD 之前多次移动 HEAD 会发生什么?谢谢。 ORIG 表示 original,ORIG_HEAD 表示原始 HEAD,重置前 "某些操作,例如合并和重置,在将 HEAD 的先前版本调整为新值之前将其记录在 ORIG_HEAD 中。您可以使用 ORIG_HEAD 恢复或恢复到先前的状态或做个比较。”摘自本书:“使用 Git 进行版本控制” 注意HEAD@1 始终是 HEAD 的前一个值,而 ORIG_HEAD 是选择命令后 HEAD 的前一个值。【参考方案4】:

    使用git reflog 获取所有参考更新。

    git reset <id_of_commit_to_which_you_want_restore>

【讨论】:

以上是关于如何撤消“git重置”?的主要内容,如果未能解决你的问题,请参考以下文章

git重置密码和用户名

text Git重置

sh git重置

sh Git重置本地提交

Git+重置+本地+来自+在线+回购

Git—重置并删除新文件