我想知道是否有办法在 github 中恢复远程删除的分支。历史清楚地记录了分支并与其他分支合并,但我不确定是否可以恢复已删除的分支。
谢谢。
是的,可以从 git 恢复已删除的分支。
如果您在过去 30 天内在本地 git 存储库中有分支,则可以使用以下命令在 reflog 中找到它:
git reflog
在 reflog 中搜索分支名称并记下该HEAD{x}
点或提交 ID。
git checkout -b branch_name HEAD@{27}
您可以签出提交 ID 并从该提交点创建一个分支:
git checkout -b branch_name <commit id>
可以请求 GitHub 支持并让他们查看reflog
您的远程存储库(例如在此线程中)。
如果距离删除足够近(默认情况下少于 30 天),则 reflog 仍包含任何分支不再引用的提交。
在其中一个提交上创建分支允许它们再次被访问。
有关 reflog 的更多信息,请参阅“什么是 reflog,为什么它如此重要? ”
更新:repo 所有者还可以查询 GitHub EVents API:
请参阅“ GitHub 是否记得提交 ID? ”
当分支已被删除很长时间(在我的情况下为 1 年),但您为该分支打开了拉取请求时,您可以通过在拉取请求历史记录中搜索来恢复它。
一旦我找到该分支的拉取请求,我就可以恢复该分支。相关的提交信息等也可以从拉取请求中获得。
git reflog
将向您展示HEAD
. 如果您删除的分支名为foo
,那么在该输出中,您应该会看到类似48534f5 HEAD@{0}: checkout: moving from master to foo
or的行48534f5 HEAD@{1}: merge foo: Fast-forward
。您可以搜索 的输出git reflog
以确定哪个提交必须是 foo 指向的最新提交。
请意识到,当 foo 被删除时,“foo”引用日志文件本身也被删除,但由于 HEAD 的引用日志不同,它仍然存在。
看看这个用于 github 事件的 python 脚本。 https://github.com/jimzucker/githubutils/blob/master/githubreflog.py
我创建它是为了拉取事件并使其可读,您可以将其输入到 grep 并查找您感兴趣的分支。如果有足够的历史记录,您将看到相关分支的删除事件,下一行将是最后一个推送事件,这就是您感兴趣的 sha。
这有点绕路,但这里是如何做到的。
如果您还没有,请从个人资料/设置/开发人员设置/个人访问令牌中获取一个新的个人访问令牌。
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
问题解决了。