如何恢复已删除的 Git 存储、已删除的分支或丢失的提交
删除的存储或删除的分支很少会永远消失:Git 会保留提交,直到垃圾收集将其删除。使用 reflog 或 git fsck 找到它们,检查它们保存的内容,并在为时已晚之前将它们放回到分支上。
撰写者 Kodmora
GitTree 背后的软件公司
- 藏匿
- 撤消和恢复
在此页面上
当您删除存储或删除分支时,Git 会删除名称,而不是提交。 提交作为无法访问的对象保留在存储库中,直到垃圾收集修剪它们(通常是两周或更长时间)。使用 git reflog 在引用日志中查找已删除分支的最后一次提交,使用 git fsck --unreachable 查找已删除的存储,使用 git show 检查它,然后使用 git branch rescue <sha> 保留它。
本指南涵盖了每种情况的确切命令,解释了 Git 保留丢失工作的时间以及无法恢复的内容,并在 GitTree 的 Lost & Found 中显示了相同的恢复,它会立即搜索每个源,并且从不检查或重置任何内容。失物招领是 GitTree 免费计划的一部分。要撤消重置、变基或修改,请阅读如何撤消 git 重置、变基和提交。
“丢失的”Git 工作实际上存在的地方
当分支、标签、存储或 HEAD 指向某个提交时,该提交就是可达的。删除分支或删除存储会使其提交无法访问,但它们仍保留在 .git/objects 中。有两条记录可帮助您找到它们:引用日志(每个分支和 HEAD 之前指向的位置)以及对象数据库本身(git fsck 可以搜索)。
| 你失去了什么 | 去哪里看 | 命令 |
|---|---|---|
| 您签出的已删除分支 | HEAD 的转发日志 | git reflog |
| 您从未签出的已删除分支 | 无法到达的提交 | git fsck --unreachable |
| 掉落或清除的藏品 | 无法访问的合并形提交 | git fsck --unreachable | grep commit |
| 重置或变基后提交丢失 | 分支的转发日志 | git reflog show <branch> |
| 从未提交或隐藏的更改 | Git 中无处可寻 | 无法从 Git 恢复 |
恢复已删除的分支
当您删除分支时,Git 会打印该分支的最后一次提交 (Deleted branch feature/login (was 3f2a9c1))。如果该消息消失了,请搜索 HEAD 的引用日志以查找您上次在分支上的时间,然后在该提交处重新创建分支。
# find the last commit of the branch
git reflog | grep "feature/login"
# check what it holds
git show 3f2a9c1 --stat
# put the branch back
git branch feature/login 3f2a9c1恢复掉落的藏品
存储一旦被删除,就没有自己的引用日志,因此请搜索无法访问的提交。存储是一种合并形状的提交,其消息以 WIP on 或 On <branch>: 开头,这使得过滤变得容易。这是 Git 自己的存储文档描述的方法。
# list unreachable stash-like commits, newest first
git fsck --unreachable | grep commit | cut -d" " -f3 \
| xargs git log --merges --no-walk --grep=WIP --format="%h %cr %s"
# inspect a candidate
git stash show -p 7c1e0b4
# restore it into your working tree, or keep it on a branch
git stash apply 7c1e0b4
git branch rescue-stash 7c1e0b4使用 git fsck --lost-found 查找每个悬空提交
git fsck --lost-found 列出悬空提交,并将每个提交的副本写入 .git/lost-found/commit/,并按其 id 命名。当您不知道要查找什么时,请使用它:列出它们及其日期和消息,然后从您想要的分支开始。
git fsck --lost-found
ls .git/lost-found/commit | xargs git log --no-walk --format="%h %cr %s"
git branch rescue 9d44b0e通过 GitTree 的 Lost & Found 恢复丢失的工作
打开失物招领处
选择 工具 → 失物招领,或按
Alt+Shift+D。它在其 开始 页面上作为完整窗口打开,其中解释了它搜索的三个来源:引用日志、GitTree 的恢复引用和无法访问的对象。寻找本地工作
勾选包括对无法访问的对象进行更深入的扫描以查找丢失的存储,然后按查找本地工作。 找到的作品列出了每个结果及其来源和查看时间; 按提交、消息或来源过滤缩小列表范围。
保存前请检查
选择一个结果: 为什么此对象出现 显示其证据,其消息和文件出现在其旁边,每个文件打开其内容。没有检查或应用任何内容。
把它挂在分支上
在 保留此提交 下,键入 新分支名称 并按 创建恢复分支。 Recovered 列出分支; 在图表中显示跳转到它。您的签出和工作文件不会改变。

Git 保留丢失的提交多久
| 环境 | 默认 | 它控制什么 |
|---|---|---|
gc.reflogExpire | 90天 | 提交的引用日志条目仍然可达 |
gc.reflogExpireUnreachable | 30天 | 提交的引用日志条目不再可达 |
gc.pruneExpire | 2周 | 没有引用日志条目的无法访问的对象,例如已删除的存储 |
垃圾收集在执行某些命令后会自行运行,因此这些是窗口,而不是承诺。你看得越早,发现的就越多。其他地方的副本(例如队友的克隆或推送的分支)是另一个安全网:仅在您的计算机上丢失的工作仅存在于那里。
什么无法挽回
- 从未提交或隐藏的更改,例如使用
git checkout -- <file>或git restore丢弃的编辑。 - 未跟踪的文件不在使用
-u制作的存储中。 - 提交垃圾收集已经修剪。
- 只存在于另一个人的计算机上的作品。
后续步骤:Lost & Found 指南 记录了每个页面和按钮,查找上一个分支提示 涵盖了引用日志视图,而 git stash 指南 解释了应用、弹出和未跟踪的文件,因此您需要恢复的频率较低。
常见问题
我可以恢复丢失的 git 存储吗?
通常,是的。删除的存储将成为无法访问的提交,直到垃圾收集将其修剪为止。使用 git fsck --unreachable 查找它,使用 git stash show -p <sha> 检查它,然后使用 git stash apply <sha> 或 git branch <name> <sha>。
如何恢复 Git 中已删除的分支?
在 git reflog 中找到分支的最后一次提交(或者删除分支时 Git 打印的“was <sha>”消息),然后运行 git branch <name> <sha> 将分支放回原处。
什么是悬空提交?
没有分支、标签、存储或引用日志条目指向的提交。 git fsck --lost-found 列出它们并将它们复制到 .git/lost-found/commit/ 中,以便您可以检查它们。
git gc 会删除丢失的提交吗?
是的,一旦它们早于过期设置:默认情况下,两周后将删除没有引用日志条目的无法访问的对象。在您恢复工作之前,请避免使用 git gc 和 git prune。
我可以恢复我从未提交过的更改吗?
不是来自 Git。只有提交或隐藏的工作才存在于对象数据库中。您可以查看编辑器的本地历史记录或备份。
GitTree的失物招领免费吗?
是的。失物招领是 GitTree 免费计划的一部分。它只读取您的本地存储库,并且它所做的唯一更改是您要求的恢复分支。
来源
有关其他产品的声明已根据其位于 2026年11月5日 的官方页面进行了检查。价格和功能发生变化;供应商的页面是事实的来源。