如何撤消'git reset'?

And*_*yuk 1172 git

什么是最简单的撤消方法

git reset HEAD~
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ato 2178

简短回答:

git reset 'HEAD@{1}'
Run Code Online (Sandbox Code Playgroud)

答案很长:

Git记录所有ref更新(例如,checkout,reset,commit,merge).您可以通过键入以下内容查看:

git reflog
Run Code Online (Sandbox Code Playgroud)

此列表中的某个位置是您丢失的提交.假设您刚输入git reset HEAD~并想要撤消它.我的reflog看起来像这样:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]
Run Code Online (Sandbox Code Playgroud)

第一行表示HEAD0位前(换句话说,当前位置)是3f6db14; 它是通过重置为获得的HEAD~.第二行表示HEAD1位前(换句话说,复位前的状态)是d27924e.它是通过检查一个特定的提交获得的(虽然现在不重要).因此,要撤消重置,请运行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
[...]
Run Code Online (Sandbox Code Playgroud)

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

  • 作为一个更加直观和更好的替代`reflog`为此目的,我喜欢使用`git log --graph --decorate --oneline $(git rev-list -g --all)`.它显示了所有提交的树,包括悬挂的未命名分支 (18认同)
  • 尝试“简短答案”(复制和粘贴)时,我收到以下错误:“致命:模棱两可的参数''HEAD@{1}'':未知修订或路径不在工作树中。”通过省略引号解决“HEAD@{1}”周围的标记。 (3认同)
  • 假设我有一个目录,其中包含现有文件。在这个目录中,我运行“git init”,然后紧接着运行“git reset --hard”。没有重新日志,甚至没有任何日志。这些文件现在已经很完美了吗? (2认同)
  • `git reset HEAD~12` oops ...`git reset HEAD @ {12}`nooo ..'git reflog'来救援!哦,它只是`git reset HEAD @ {1}` (2认同)

Dan*_*her 164

老问题,发布的答案很有用.不过我会选择其他选项.

git reset ORIG_HEAD

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

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

zai*_*eer 48

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

要撤消它我必须这样做

git reset HEAD@{3}
Run Code Online (Sandbox Code Playgroud)

所以你应该能做到

git reset HEAD@{N}
Run Code Online (Sandbox Code Playgroud)

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

git reset HEAD~3
Run Code Online (Sandbox Code Playgroud)

你需要做的

git reset HEAD@{1}
Run Code Online (Sandbox Code Playgroud)

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

  • 这与接受的答案有何不同? (11认同)
  • 但是如果有人做了git reset HEAD~3他可以很快看到如何撤消它,git reset HEAD @ {3}是必需的而不需要进入reflog git reset HEAD~3等是常见情况 (3认同)
  • 接受的选项不提供前进的例子N我在一小时前处于一种情况,我想要转发超过1.尝试多次,它工作.想在这里补充一下.对于使用git reset HEAD~3寻找撤消重置的人来说非常有用 (2认同)

use*_*064 47

答案大多数时候有效

git reset 'HEAD@{1}'
Run Code Online (Sandbox Code Playgroud)

答案每次都有效

git reset --hard 'HEAD@{1}'
Run Code Online (Sandbox Code Playgroud)

where--hard使得一切都和以前一样。


omi*_*lus 21

1. git reflog使用更新所有参考.

2.git reset <id_of_commit_to_which_you_want_restore>

3下次避免这种情况