Git 历史回退自救手册:reflog 找回与分支指针恢复

该指南来自于一次自我感觉惊险的经历

一份精简但可操作的“掉历史”自救清单:当你在 GUI 或命令行误操作后,发现最近提交“消失”时,如何快速定位并安全恢复。

典型症状

  • 近期提交不见了git log 顶端不是你刚做的提交。
  • 工作区回到旧版本:本地文件和远端网站内容明显“时光倒流”。
  • 远端与本地不一致git status -sb 显示 main...origin/main [ahead N|behind N]

成因与诱因(简明)

  • 直接成因:分支指针被移到旧提交,或进入分离 HEAD,导致近期提交不在当前分支历史中。
  • 前几天可能埋下的雷
    • 直接 git checkout <commit> 查看旧版本后继续开发/提交;
    • 用 GUI 的“Checkout/Reset/Restore”类功能回到旧提交但未建保护分支;
    • 偶发 git reset --hard <old>
    • 未及时推送,远端与本地脱节,引发误判。
  • 今天触发的动作:在 GUI 中对某个旧提交执行了“Checkout/Reset”,把当前分支(例如 main)指针回退了。

本次拯救(摘要)

  1. reflog 找到目标提交 <sha>(历史未丢,只是指针偏了)。

  2. 二选一恢复:

# 安全合并法(推荐)
git checkout -b restore-work <sha>
git checkout main
git merge restore-work

# 或:直接重置法(快捷)
git checkout main
git reset --hard <sha>
  1. 如远端历史需以本地为准:git push -f origin main

恢复步骤

# 1) 快速浏览当前可达历史
git log --oneline -10

# 2) 关键:查看 HEAD 的移动“航迹记录”
git reflog -20
  • reflog 输出中,找到你需要回到的那次正确提交的 SHA(记为 <sha>)。

两种恢复方式(择一)

# 从目标提交创建保护分支
git checkout -b restore-work <sha>

# 回到主分支并合并恢复
git checkout main
git merge restore-work

说明:保留现场,历史连贯,最不容易出岔子。

git checkout main
git reset --hard <sha>

说明:让当前分支指针“瞬移”到 <sha>;如远端不是你想要的历史,后续可能需要强推。

同步远端(如有需要)

# 仅当你确认“本地才是正确历史”时才执行强推!
git push -f origin main

预防与习惯(精简版)

  • 查看旧版本用新分支git checkout -b inspect-<date> <sha>
  • 小步提交,及时推送:远端即备份。
  • 危险操作前打快照git branch backup-<date>git tag safety-<date>
  • 丢历史先看 reflog:优先 git reflog,再考虑其他。