git 找回误删的提交:git reflog 实战
误用了 git reset --hard、git branch -D 删了分支、或提交凭空消失了?git reflog 是你的"后悔药",能找回几乎任何丢掉的提交。本文用真实场景讲透操作步骤。
场景:你手一抖执行了 git reset --hard,或 git branch -D 删掉了一个还没合并的分支,几个小时的代码「凭空消失」了。先别崩溃——Git 不会轻易删除对象,git reflog 通常能把它们找回来。
为什么能找回
git reset、git branch -D 这类操作并不会真的删除提交对象,只是让分支指针不再指向它们。这些「孤儿提交」仍躺在仓库里,而 reflog 忠实地记录了 HEAD 的每一步移动,所以能据此定位。
第一步:查看 reflog
git reflog
你会看到类似输出,从最近到最早排列:
a1b2c3d HEAD@{0}: reset: moving to HEAD~2
e4f5g6h HEAD@{1}: commit: 添加登录功能
i7j8k9l HEAD@{2}: commit: 修复样式
每一行 = 你的一次操作。HEAD@{1} 这种引用,指向「上一次」HEAD 的位置。e4f5g6h 就是你要找的那个提交。
第二步:把找回的提交恢复成分支
确认哈希后,把它拉回一个新的分支(推荐,安全):
git checkout -b recover-e4f5g6h e4f5g6h
现在你站在新分支上,代码回来了。核对无误后,可把它合并回原分支:
git switch 原分支
git merge recover-e4f5g6h
恢复误删的分支
如果你删的是整个分支(含多提交),reflog 会记录该分支最后一次 HEAD 位置:
git reflog | grep 分支名
# 找到最后一次的哈希
git branch 分支名 找到的哈希
分支瞬间恢复。
更快:直接回到那个提交
如果你确信那个提交就是要的最终状态,也可直接:
git reset --hard e4f5g6h
注意:reset --hard 会同时丢弃当前工作区改动,务必先确认当前没有想保留的东西。
防止丢失的日常习惯
- 删除分支前确认是否已合并:
git branch -D前多看两眼 - reset --hard 前先
git stash或git branch backup留个备份 - 重要提交及时 push 到远程(远程不可被本地 reset 影响)
常见问题
- reflog 里找不到:可能已超 90 天或被 gc 清理;若提交曾 push 过,从远程
git fetch后用git log --all找。 - 合并冲突不知道选哪个:reflog 找的是「提交快照」,本质安全,切出来看内容再决定。
一句话速记
git reflog 看历史位置 → git checkout -b 恢复分支 哈希 拉回代码。
?
常见问题 FAQ
git reflog 能找回多久以前的操作?
reflog 默认保留约 90 天内的本地操作记录(可用 gc.reflogExpire 配置)。超期或执行了 git gc 清理后可能丢失。
被 reset --hard 丢弃的提交 reflog 一定能找回吗?
只要该提交还存在于 reflog 里就能找回。但若之后又执行了 git gc --prune=now 或 reflog 被清空,就难以恢复了。误删后应尽快用 reflog 操作,避免更多提交。
reflog 和 git log 有什么区别?
git log 只显示当前分支可达的提交;git reflog 记录的是你本地 HEAD 的所有移动历史,包括已 reset 掉、已删分支指向的提交,所以能找到 log 里看不到的提交。
找回了提交,怎么把它恢复成当前分支?
用 git checkout -b 新分支名 提交哈希 或 git cherry-pick 提交哈希 把提交应用到当前分支;也可 git reset --hard 提交哈希 直接回到那个状态。