恢复已删除的 git 个你不知道其名称的分支

restore deleted git branch you don't know the name of

所以一位同事问我(作为团队实习生 GitHub 经理)是否可以恢复他几个月前创建的分支,最近删除但不记得名称。我们的工作树如下:

  1. master 分支(主要生产版本)
  2. 暂存分支(测试 在发布到 master 之前)
  3. 开发分支(主开发分支,所有未来的分支都是从这里创建的
  4. 个人分支(我们进行更改的个人分支,从开发创建,完成后合并回开发)

有问题的分支是从 Development 创建的,但它从未被合并回来,因为它变旧了,工作优先级将它推回了。现在有时间再次处理它,我们想知道是否有可能检索某种历史记录,我们可以用它来帮助我们记住分支名称,这样我们就可以恢复它……如果可能的话……

如有任何建议,我们将不胜感激!用谷歌搜索,但大多数答案都是基于已合并回的分支。

您可以使用 git reflog 检查 HEAD 指向的位置。

可能有checkout: moving from develop to personal_branch这样的信息,commit是HEAD指向的personal_branch

如果在 .git/logs 中不幸清除了日志历史记录,您可以改用 git fsck --full

根据 Marina - MSFT 的回答,最好的情况是在最初创建分支的 repo 的 reflog 中找到帮助(因为它最有可能拥有相关的 reflog 条目)。

但如果这没有帮助,计划 B 将是找到悬空提交。同样,假设最近删除了分支,这在曾经容纳该分支的回购中成功的机会最大。 (一旦提交变得不可访问,gc 可能会完全删除提交,然后夹具就启动了。)寻找它们的一种方法是

git fsck --unreachable --verbose

并检查类似

的输出
unreachable commit c0d3abcd...

如果你看到的话,你可能会看到几个;你可以使用

git cat-file -p c0d3abcd

看看每一个是什么。如果您找到一个代表您想要工作的州,请在其上放置一个分支。 (原来的分支名称此时基本无法恢复。)

如果本地存储库丢失了 gc 的对象,您可以尝试远程存储。它可能不会在克隆或拉取请求中发送无法访问的对象(尽管 可能 它会取决于服务器实现,你不能指望它),但它可能提供API 用于检查其引用日志或无法访问的对象。