跳至内容
GitTree
Git 指南阅读 2 分钟

如何恢复已删除的 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 恢复丢失的工作

  1. 打开失物招领处

    选择 工具 → 失物招领,或按 Alt+Shift+D。它在其 开始 页面上作为完整窗口打开,其中解释了它搜索的三个来源:引用日志、GitTree 的恢复引用和无法访问的对象。

  2. 寻找本地工作

    勾选包括对无法访问的对象进行更深入的扫描以查找丢失的存储,然后按查找本地工作。 找到的作品列出了每个结果及其来源和查看时间; 按提交、消息或来源过滤缩小列表范围。

  3. 保存前请检查

    选择一个结果: 为什么此对象出现 显示其证据,其消息和文件出现在其旁边,每个文件打开其内容。没有检查或应用任何内容。

  4. 把它挂在分支上

    在 保留此提交 下,键入 新分支名称 并按 创建恢复分支。 Recovered 列出分支; 在图表中显示跳转到它。您的签出和工作文件不会改变。

GitTree 中的 Lost & Found 在其起始页上打开:在查找本地工作之前,引用日志、恢复参考和可选的更深入扫描。
GitTree 中的 Lost & Found 在其起始页上打开:在查找本地工作之前,引用日志、恢复参考和可选的更深入扫描。

Git 保留丢失的提交多久

Git 的默认过期设置
环境默认它控制什么
gc.reflogExpire90天提交的引用日志条目仍然可达
gc.reflogExpireUnreachable30天提交的引用日志条目不再可达
gc.pruneExpire2周没有引用日志条目的无法访问的对象,例如已删除的存储

垃圾收集在执行某些命令后会自行运行,因此这些是窗口,而不是承诺。你看得越早,发现的就越多。其他地方的副本(例如队友的克隆或推送的分支)是另一个安全网:仅在您的计算机上丢失的工作仅存在于那里。

什么无法挽回

  • 从未提交或隐藏的更改,例如使用 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日 的官方页面进行了检查。价格和功能发生变化;供应商的页面是事实的来源。