恢复已删除的Git分支
这些代码块对应不同情况,不是一个完整脚本。请选择适合仓库的情况,并替换分支名、路径和VERIFIED_COMMIT。中止命令只适用于对应的正在进行的操作,不要执行两种备选方案。
简短答案
删除分支会移除引用,不一定立即删除提交。找到仍然保留的分支顶端提交,再建立一个指向它的分支。
示例与前提
你需要正确提交以及仍可用的对象。删除提示可能显示其SHA;保存它,并在操作前核对。
修改前检查状态
读取HEAD的reflog和候选历史。分支的reflog会随分支一起删除,但HEAD记录可能保留相关移动。
git reflog --date=iso
git show VERIFIED_COMMIT
git log -5 --oneline VERIFIED_COMMIT保留引用或独立检出
用git branch rescue/deleted-branch VERIFIED_COMMIT命名提交,无须切换分支或覆盖工作目录。
git branch rescue/deleted-branch VERIFIED_COMMIT第一种操作
用git show和git log确认目标顶端和历史。若原分支名没有被占用,再重新建立它。
有意选择另一种结果
如果曾有远程分支,在fetch和重建本地分支前确认远程引用仍然存在。过去推送过不代表现在仍被保留。
限制与例外
新clone不会带来你的本地reflog。reflog过期和对象清理是不同策略;恢复期间应避免激进清理。
git ls-remote --heads origin my-branch冲突与清理
如果缺少引用,git fsck --full --no-reflogs --unreachable可以查找保留的提交。逐一检查候选,因为命令不会自动知道你要恢复哪个分支。
git fsck --full --no-reflogs --unreachable验证结果
检查重建分支的历史和状态。恢复提交不会恢复从未提交过的文件编辑。
git log -5 --oneline rescue/deleted-branch
git status --short常见问题
丢失的分支名不是备份。如果对象已经消失,寻找其他副本、协作者,或实际仍存在的远程引用。
在FluxGit中审查操作
FluxGit可以保护应用内的分支删除。启用的Ref journal在已安装hook执行时记录引用变化;绕过hook的操作和其他Git实现不在该覆盖范围内。
Git官方文档
用reflog恢复已删除的Git分支
找到最近删除的本地分支仍保留的提交,创建新分支来恢复。通过测试仓库介绍reflog和FluxGit的Safety Timeline,并说明已安装的Ref journal钩子在什么条件下能记录Git命令行的引用更改。
在测试仓库中录制。英语旁白,简体中文字幕。恢复需要仍保留的提交对象和可用的reflog或日志记录;Ref journal不会备份未提交的文件。
阅读旁白文字稿
- 你删除了一个有工作成果的分支:git branch -D。分支上有两个从未合并到其他地方的提交。下面介绍如何找回。
- 在 FluxGit 中,这个分支已经从列表中消失了。
- 工作成果没有丢失的原因是:分支只是一个标签。git branch -D 删除标签,但两个提交仍留在仓库中,只是没有分支指向它们。reflog 仍然记得它们。在最后一个提交上创建分支,两个提交就都回来了。
- 打开 Safety Timeline,它用易懂的句子显示 reflog。
- 在 Find a lost commit 中输入部分提交消息。找到一条结果:已删除分支的最后一个提交。
- Create branch here。恢复分支指向这个提交,其他内容都不会移动。
- 两个提交都回到了图中。
- 为这个仓库开启Ref journal。
- 已安装的Git钩子运行时,FluxGit可以记录通过Git命令行执行的分支删除,包括终端或代理的命令。
- 绕过钩子和使用其他Git实现的情况不在覆盖范围内。
- 它记录的是引用,而不是未提交的文件。
- 恢复仍需要提交对象存在。
- 在终端中执行 git reflog,找到提交,再执行 git branch,指定原来的名称和这个提交。
- 总结:删除分支只是丢失标签,reflog 仍能找到提交。下一课:AI 代理删除了你的代码时怎么办。