谢谢。
是的,可以从Git中恢复已删除的分支。
如果您在过去30天内在本地Git存储库中有该分支,则可以尝试使用以下命令在reflog中查找它:查找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,为什么它如此重要?”
当一个分支已经被删除很长时间(在我的情况下是1年),但你曾经为该分支打开了一个拉取请求,你可以通过搜索拉取请求历史来恢复它。
一旦我找到了该分支的拉取请求,我就可以恢复该分支。相关的提交信息等也可以从拉取请求中获取。
这有点繁琐,但以下是如何操作的。
如果您还没有个人访问令牌,请从“个人资料/设置/开发者设置/个人访问令牌”处获取一个新的。
curl -u "username:PersonalAccessToken" -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/RepoOwner/Repo/events
git fetch SHA
git switch -c name-of-your-deleted branch
问题已解决。
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不同,它仍然存在。
请查看这个关于Github事件的Python脚本。 https://github.com/jimzucker/githubutils/blob/master/githubreflog.py
我创建了它来提取事件并使其可读,您可以将其导入grep并查找您感兴趣的分支。如果有足够的历史记录,您将看到有关所讨论分支的删除事件,下一行将是最后一个推送事件,这就是您感兴趣的sha。
reflog
然后跟着git branch <branch-name> <commit>
。(你忘记了一个参数)。如果因为某种奇怪的原因你不想实际上取回原来的分支,而只是跳过去并将其合并到当前提交中,那么是的,你可以使用git checkout -b <branch-name>; git merge <commit>
。虽然我不知道为什么那会是你的默认建议。 - Cascabelgit reflog
将显示_HEAD_的历史记录。你必须在其中搜索已删除的foo
分支的出现。查找“HEAD@{0}”毫无帮助。请参见下面的我的答案。 - Alexander Bird