Recovery

pull 之后后悔了怎么撤回

当 pull 之后发现分支状态不对、自动 merge 不符合预期,或者 rebase 结果混乱时,先判断 pull 实际做了什么,再选择 ORIG_HEAD、reflog 或救援分支。

适合谁看
  • 正在处理 Git 误操作的人
  • 想提前建立保守恢复习惯的协作者
前置知识
  • 先停手,不继续乱试命令
  • 能执行 `git reflog`、`git status`、`git log --graph`
常见风险
  • 还没保住旧位置就继续 reset / rebase
  • 在没判断影响面时直接改共享历史

先别急着说“我要撤回 pull”

真正要先弄清的是:这次 git pull 到底做了什么。

它可能只是:

  • 做了一个 fetch
  • 做了快进更新
  • 做了一个 merge
  • 或者按配置走了 rebase

不同路径,撤回方式不一样。

先判断 pull 的实际结果不要把所有 pull 后悔场景都当成一个问题。先分清它是快进、merge 还是 rebase,恢复动作才会稳。
先观察
git statusgit log --oneline --graphgit reflog
可能结果
快进更新merge 提交rebase 改写
恢复前先回答:这次 pull 改的是引用、历史结构,还是只是让当前分支快进。

第一轮检查

git status
git log --oneline --graph --decorate -n 20
git reflog

如果你看到了:

  • 一个新的 merge commit:多半是 merge 型 pull
  • 一串新提交 ID:多半是 rebase 型 pull
  • 没有额外 merge,只是分支前进了:多半是 fast-forward

ORIG_HEAD 为什么很重要

很多 merge 和 pull 场景里,Git 会把操作前的位置记到 ORIG_HEAD

git show ORIG_HEAD
git switch -c rescue/before-pull ORIG_HEAD

这通常是最便宜的保险动作。

三类常见撤回方式

1. pull 只是快进了

如果只是快进,而且你就是想回到 pull 前:

git reset --hard ORIG_HEAD

但在真正执行前,先建救援分支更稳:

git switch -c rescue/before-pull ORIG_HEAD

2. pull 产生了 merge commit

如果这个 merge 还没共享出去,通常可以考虑把当前分支回到 merge 前的位置。
但如果这次 pull 已经继续被别人基于它工作,就应该更谨慎,优先考虑 revert

3. pull 走的是 rebase

这时更像“rebase 出错恢复”问题。
直接看 reflog,找到 pull / rebase 前的位置,再先建救援分支。

一个更稳的习惯

很多“pull 后悔了”问题,本质上都来自于 pull 同时做了“获取远端变化”和“改当前分支”两件事。
如果你想降低这类事故,平时更稳的节奏是:

  1. git fetch
  2. 看图和状态
  3. 再决定 merge、rebase,还是先不动

推荐恢复顺序

  1. 先确认这次 pull 是哪条整合路径
  2. ORIG_HEADreflog
  3. rescue/* 分支
  4. 再决定 reset、revert 或重做同步

一个判断原则

如果你还没搞清 pull 产生的是 merge 还是 rebase,就先不要动 reset。
先把“pull 前的位置”接住,比立刻回滚更重要。