IDEATOX

ideatox.com 面向中文开发者与数字工作者,记录 AI 工具、在线工具、隐私边界与工程实践。

分支删了或 reset 错了:用 reflog 先找回提交

不要立刻再做一次 reset。先在本地 reflog 找到提交,检查内容并创建恢复分支;说明未提交文件与已经清理对象的恢复边界。

文章目录

删掉一个本地分支,或者 reset 到错误位置,工作树里看不到之前的代码了。先停止继续清理仓库。只要提交对象还在,通常可以用本地引用更新记录找到线索;恢复时先新建分支,比马上改动当前分支更容易检查。

reflog 记录的是本地引用变化

git reflog show HEAD --date=iso

查看 reset、checkout、rebase 等操作前后的提交标识。记下日期和操作说明,再挑候选提交。记录来自当前本地仓库,不会因为推送自动成为远端的同一份历史;另一台电脑可能有不同记录。

不要直接复制一行编号就执行 reset --hard。HEAD@{3} 这样的序号会随着后续操作变化,先记录实际提交哈希。找不到时,还可以检查相关分支的 reflog,或查看其他本地克隆、远端分支和同事已有的提交;这些是不同证据来源。

先确认找回的是哪一版

把 abc1234 换成候选提交标识:

git show --stat abc1234
git show abc1234:path/to/file
git branch rescue-before-reset abc1234

show --stat 看改动概况,第二条查看指定提交里的文件,第三条给该提交增加一个本地分支引用。它不会切换当前工作树,因此可以先建立恢复点,再安排合并。

恢复分支名已存在时换一个名字,不能为了继续流程强行覆盖。提交存在但文件路径不对,git show 会报错;用提交树确认路径,而不是把报错当成内容已经没了。

检查差异后再接回当前分支

git log --oneline --decorate rescue-before-reset -10
git diff main...rescue-before-reset

这里假设仓库有 main。三点 diff 比较共同祖先到恢复分支的变化,适合看分支贡献;若要比较两个端点的实际内容,可用两点或不带点的两提交 diff。选择哪一种取决于你要回答的问题。

已有未提交改动时,先另存或按自己的工作流程提交,不急着切换分支。确定需要的提交后再选择 merge 或 cherry-pick;避免把整个旧分支连同已经撤回的更改一起带回。

哪些东西 reflog 找不回来

未提交、未保存到对象中的文件变化,不会因为 reflog 里有一次 reset 记录就自动恢复。编辑器本地历史、文件备份可能提供帮助,但那不属于提交恢复。

reflog 会过期,不可达对象也可能被垃圾回收。默认保留策略还会被仓库配置或维护任务改变,所以不能把 reflog 当成长期备份,更不要在恢复前运行激进的清理命令。已经没有对象时,找到一个旧哈希本身也不足以重建代码。

记录恢复依据、提交哈希和新分支名称,再运行相关测试。命令含义可查 reflog 文档、branch 文档与 show 文档。

继续阅读 · 工程实践 返回顶部