恢复远程Git分支

3

在我进一步说明之前,让我解释一下为什么我们不能做a:

git checkout -b <branch> <sha>

基本上,这个分支(我们称之为dev1)在另一个开发者的机器上。他进行了一些提交并将它们推送了上去。这个分支是从另一个分支(我们可以称之为Features)中分支出来的,该分支正在被重命名为developmentdevelopment作为Features的一个分支创建,然后删除了features分支。 然后,另一个开发人员在本地和远程都删除了开发者的分支(dev1)。当使用Github for Windows时,他发现所有分支都要求被推送,所以他删除了整个文件夹(跳过了回收站),并重新克隆了仓库。 因此,现在他无法执行以下操作:

git reflog

因为它没有任何历史记录,所以我无法看到他的提交,因为它们从未被拉取到我的本地机器上。

所以,考虑到这一点,有没有一种远程恢复他的dev1分支的方法? 我一直在寻找一个命令,可以显示所有已删除的远程分支,但到目前为止,我还没有找到这样的命令。

任何帮助都将避免数周的开发工作!


由于dev1在被删除之前已经被推送,因此dev1的tip提交和其父提交应该存在于远程仓库中,很可能作为悬空对象存在。创建一个新的克隆并运行git fsck以查找所有悬空对象,并在其中查找提交对象。git cat-file -t <object-sha1>可以列出对象类型。逐个运行git show来检查这些悬空提交。我认为你可以找到哪个提交是dev1的tip。如果找到了,运行git branch dev1 <sha1>来恢复它,然后将dev1推回去。 - ElpieKay
他确实进行了克隆,当他执行 git fsck 时,根本没有返回任何东西。 - r3plica
我能想到两种可能性。一种是dev1的提示仍然被其他分支或标签引用,可能是development。另一种可能是悬空对象被git gc清理了。如果是第一种情况,您可以在development的历史记录中找到它。如果是第二种情况,也许只有文件恢复工具才能帮助您。 - ElpieKay
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - r3plica
当一个“分支”被删除时,只有引用被删除了。它曾经到达的提交在git gc清除它们之前仍然存在,如果它们从任何分支、标签或reflog中不可访问。如果没有备份就删除存储库,则提交(提交对象、树对象、作为文件的blob对象)将丢失。不进行备份是一个大问题。 - ElpieKay
1个回答

2
您可以使用GitHub事件API查看用户或存储库在过去90天内发生的最后300个事件(每页分页为30个事件)。在那里,您可以搜索该分支上的最后一个推送事件,从而获取您需要重新实例化为分支的SHA-1。
例如,在这里,您可以查看我的最近事件:https://api.github.com/users/Vampire/events, https://api.github.com/users/Vampire/events?page=2等。
这里是关于代码库 vivin/gradle-semantic-build-versioning 的事件:https://api.github.com/repos/vivin/gradle-semantic-build-versioning/eventshttps://api.github.com/repos/vivin/gradle-semantic-build-versioning/events?page=2 等等。

听起来很不错,但是这个仓库是私有的,如果不创建应用程序并使用OAuth,似乎我无法看到与该仓库相关联的事件。 - r3plica
你可以使用基本认证 (https://developer.github.com/v3/auth/) 实现。我刚试了一下,使用基本认证,我可以获取我的私有代码片段、仓库等信息,否则就不能。 - Vampire

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