撤销git pull --rebase

69

嘿,我是git的新手,需要撤销一个pull,有人可以帮忙吗?所以我做的是...

  1. git commit
  2. git stash
  3. git pull --rebase
  4. git stash pop

这创建了一堆冲突并出了点问题。现在进行'git stash list'显示我的stash仍在那里。是否可能将我的存储库还原回到刚刚进行git commit的那个时刻。因此,我的repo只包含我所做的更改,而不是来自服务器的任何新内容?

4个回答

169

实际上,为了使这个过程更容易,Git 保留了一个名为 ORIG_HEAD 的引用,指向 rebase 之前的位置。所以,操作起来就像这样简单:

git reset --hard ORIG_HEAD

9
我差点失去了一周的工作成果,但是这个操作使它复原了。当别人在没有拉取你的更改之前,对你的分支进行rebase并强制推送到源码库时,就会发生这种情况...如果你在一个组织中与他人协作开发项目,并且他们要求大家都使用rebase而非merge,那么这个问题绝对值得注意。与拥有清晰历史记录相比,rebase是危险的。 - Gavin
这就是我需要的答案。 - Obinna Nnenanya
1
这种方法比使用reflog的接受答案要好得多。 - Ka Mok
1
这个答案增加了更多细节: https://dev59.com/6GTWa4cB1Zd3GeqPFaRj#10907222 - jciloa

53
git reflog

命令可以查看过去HEAD指向的提交列表。

git checkout -b after-commit HEAD@{1} # or the commit you want to recover

在该位置创建一个新的分支并将其检出


在做这个的时候,会出现一个错误提示,告诉我有一个文件将被合并覆盖。有没有办法忽略这个错误? - Thomas
8
确保你的当前工作目录是干净的(可以使用 git reset --hard HEAD 命令实现此目的)。同时,确保变基操作不再进行中(可以使用 git rebase --abort 命令取消变基操作)。 - Wayne Conrad
40
曾经历过此事!我认为我已经犯了使用Git时可能会犯的各种错误。Git就像一把没有保护罩的锯,容易误伤自己。但它也带有简便的手臂再连接工具,你甚至可以将手臂接在膝盖上。 - Wayne Conrad
@wayne-conrad,我可以引用你的“...将手臂固定在膝盖上”这句话吗? - Gonen
@Gonen,我很荣幸。请继续。 - Wayne Conrad
显示剩余3条评论

8
你应该检查一下这个命令。
git reset --merge

这样就不需要在进行拉取之前使用git commit和git stash了(但是不确定rebase是否适用)。

该命令将返回一个工作区,其中包含未提交的更改,以便在冲突的拉取之前将其恢复到之前的状态。


0
使用命令 git log -g 找到你想要回溯的提交索引,然后执行 git checkout 命令即可。

这并没有实际帮助,因为 pull --rebase 会在你刚刚拉取的内容之上回放你的提交记录;在这种情况下,你不能只是检出你的旧提交记录,因为它在你刚刚拉取的提交记录之上。 - Achal Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接