如何撤消“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 checkout
或git 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重置”?的主要内容,如果未能解决你的问题,请参考以下文章