Git School · FluxGit

恢复已删除的Git分支

FluxGit ·

这些代码块对应不同情况,不是一个完整脚本。请选择适合仓库的情况,并替换分支名、路径和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官方文档

Git School · 1:51

用reflog恢复已删除的Git分支

找到最近删除的本地分支仍保留的提交,创建新分支来恢复。通过测试仓库介绍reflog和FluxGit的Safety Timeline,并说明已安装的Ref journal钩子在什么条件下能记录Git命令行的引用更改。

用reflog恢复已删除的Git分支
旁白为英语。YouTube提供11种语言的手动字幕。此文字稿为简体中文。

在YouTube观看 — 在新标签页打开

在测试仓库中录制。英语旁白,简体中文字幕。恢复需要仍保留的提交对象和可用的reflog或日志记录;Ref journal不会备份未提交的文件。

阅读旁白文字稿
  1. 00:03 你删除了一个有工作成果的分支:git branch -D。分支上有两个从未合并到其他地方的提交。下面介绍如何找回。
  2. 00:13 在 FluxGit 中,这个分支已经从列表中消失了。
  3. 00:17 工作成果没有丢失的原因是:分支只是一个标签。git branch -D 删除标签,但两个提交仍留在仓库中,只是没有分支指向它们。reflog 仍然记得它们。在最后一个提交上创建分支,两个提交就都回来了。
  4. 00:36 打开 Safety Timeline,它用易懂的句子显示 reflog。
  5. 00:44 在 Find a lost commit 中输入部分提交消息。找到一条结果:已删除分支的最后一个提交。
  6. 00:52 Create branch here。恢复分支指向这个提交,其他内容都不会移动。
  7. 00:58 两个提交都回到了图中。
  8. 01:02 为这个仓库开启Ref journal。
  9. 01:06 已安装的Git钩子运行时,FluxGit可以记录通过Git命令行执行的分支删除,包括终端或代理的命令。
  10. 01:15 绕过钩子和使用其他Git实现的情况不在覆盖范围内。
  11. 01:19 它记录的是引用,而不是未提交的文件。
  12. 01:23 恢复仍需要提交对象存在。
  13. 01:28 在终端中执行 git reflog,找到提交,再执行 git branch,指定原来的名称和这个提交。
  14. 01:36 总结:删除分支只是丢失标签,reflog 仍能找到提交。下一课:AI 代理删除了你的代码时怎么办。

相关操作

下载FluxGit