Github是否会在历史记录中保留已删除的远程分支?如果是,那么这些分支可以恢复吗?

71
我想知道是否有办法在github上恢复远程删除的分支。历史记录清楚地保留了该分支和其他分支的合并记录,但我不确定是否可以恢复已删除的分支。
谢谢。
6个回答

79

是的,可以从Git中恢复已删除的分支。

查找您的提交ID:使用git reflog搜索分支

如果您在过去30天内在本地Git存储库中有该分支,则可以尝试使用以下命令在reflog中查找它:查找reflog

git reflog

在reflog中搜索分支名称,注意HEAD{x}指向或提交ID。

从Reflog HEAD点重新创建分支:

git checkout -b branch_name HEAD@{27}

从提交ID重新创建分支:

您可以检出提交ID,并在该提交点上创建一个新的分支:

git checkout -b branch_name <commit id>

34
这并没有解决原作者的问题。你所做的只是解释了一个迂回的方法来找出当前检出的提交(无论它是否在分支上)。如果删除的远程分支没有指向HEAD,这并没有帮助。但如果你在某个时候检查过它们,它们可能会在reflogs更深的位置。 - Cascabel
3
有点吧。有点混乱。你真的想要使用 reflog 然后跟着 git branch <branch-name> <commit>。(你忘记了一个参数)。如果因为某种奇怪的原因你不想实际上取回原来的分支,而只是跳过去并将其合并到当前提交中,那么是的,你可以使用 git checkout -b <branch-name>; git merge <commit>。虽然我不知道为什么那会是你的默认建议。 - Cascabel
3
我有所遗漏吗?我认为这个答案甚至没有“稍微”回答问题。git reflog将显示_HEAD_的历史记录。你必须在其中搜索已删除的foo分支的出现。查找“HEAD@{0}”毫无帮助。请参见下面的我的答案 - Alexander Bird
@AlexanderBird,“我是不是错过了什么?”是的,请阅读:http://gitolite.com/concepts/reflog.html - Highway of Life
@AlexanderBird,是的,在看了您的评论和答案后,我意识到需要给出更好的解释。 :) -- 谢谢! - Highway of Life
显示剩余4条评论

14

你可以向GitHub支持团队提出请求,让他们查看你的远程仓库的reflog(例如在这个帖子中)。
如果这个操作离删除时间很近(默认小于30天),reflog仍然包含那些不再被任何分支引用的提交。
在其中一个提交上创建一个分支可以使它们再次可访问。

想要了解更多关于reflog的信息,请参阅“什么是reflog,为什么它如此重要?


更新:仓库所有者还可以查询GitHub事件API:
请参阅“GitHub是否记住提交ID?

8

当一个分支已经被删除很长时间(在我的情况下是1年),但你曾经为该分支打开了一个拉取请求,你可以通过搜索拉取请求历史来恢复它。

一旦我找到了该分支的拉取请求,我就可以恢复该分支。相关的提交信息等也可以从拉取请求中获取。


1
我的分支删除已经超过30天了,实际上已经有8个月了,有什么办法可以恢复它吗?如预期的那样,在reflog中我找不到任何东西,也没有拉取请求。 - C.Dhruv

7

这有点繁琐,但以下是如何操作的。

如果您还没有个人访问令牌,请从“个人资料/设置/开发者设置/个人访问令牌”处获取一个新的。

curl -u "username:PersonalAccessToken" -H "Accept: application/vnd.github.v3+json"  https://api.github.com/repos/RepoOwner/Repo/events

在响应中找到 DeleteEvent;在其中,您将能够找到您已删除的分支的孤立 SHA。
git fetch SHA
git switch -c name-of-your-deleted branch

问题已解决。


1
我遇到了一个有趣的边缘情况。如果将“自动删除主分支”设置为true,这些分支将不会显示在您的事件中。在这种情况下(如果分支在PR中),您可以导航到该PR并点击“恢复分支”按钮。 - runamok
很不幸,这并没有给我提交的SHA,只有被删除的分支名称(删除事件的文档:https://docs.github.com/en/rest/overview/github-event-types?apiVersion=2022-11-28#deleteevent)。 - undefined

1

git reflog会显示HEAD的历史记录。如果你删除的分支名为foo,那么在输出中,你应该会看到类似于48534f5 HEAD@{0}: checkout: moving from master to foo或者48534f5 HEAD@{1}: merge foo: Fast-forward的行。你可以搜索git reflog的输出来确定哪个提交是最新的指向foo的。

请注意,当foo被删除时,"foo" reflog文件本身也被删除了,但由于HEAD的reflog不同,它仍然存在。


1

请查看这个关于Github事件的Python脚本。 https://github.com/jimzucker/githubutils/blob/master/githubreflog.py

我创建了它来提取事件并使其可读,您可以将其导入grep并查找您感兴趣的分支。如果有足够的历史记录,您将看到有关所讨论分支的删除事件,下一行将是最后一个推送事件,这就是您感兴趣的sha。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接