重置——在远程reflog中硬git远程分支到SHA,但不在本地repo中

重置——在远程reflog中硬git远程分支到SHA,但不在本地repo中,git,github,branch,reset,Git,Github,Branch,Reset,有没有办法将远程分支指针重置为您知道在远程reflog中但在本地repo中没有的SHA 我非常熟悉重置(软/混合/硬)在本地回购上的工作方式,但这对我没有帮助 这是我正在努力解决的情况。我已经有一段时间没有抓取了,远程主机已经用本地还没有的合并进行了更新 我搞砸了,做了一个git-push--force,意思是只更新远程功能分支,但忘记了一个参数,结果强制功能分支和master进行本地的修订 这意味着master现在缺少自上次获取以来发生的合并提交。我们正在使用github,所以我收到一封电子邮

有没有办法将远程分支指针重置为您知道在远程reflog中但在本地repo中没有的SHA

我非常熟悉重置(软/混合/硬)在本地回购上的工作方式,但这对我没有帮助

这是我正在努力解决的情况。我已经有一段时间没有抓取了,远程主机已经用本地还没有的合并进行了更新

我搞砸了,做了一个
git-push--force
,意思是只更新远程功能分支,但忘记了一个参数,结果强制功能分支和master进行本地的修订

这意味着master现在缺少自上次获取以来发生的合并提交。我们正在使用github,所以我收到一封电子邮件,告诉我master之前所在的SHA。我还可以转到url,看到提交仍然存在(还没有垃圾收集)

我可以通过重做我丢失的合并并再次推出它来“修复”它(这最终改变了SHA,因为它是一个不同的提交者和时间)。这不是最优的,如果我在主服务器上丢失了多个合并提交,情况可能会更糟

我本想做的只是
重置--hard
远程主分支到它应该位于的SHA。在没有SSH访问repo的情况下,有没有办法做到这一点

这是在github上的,因此我无法直接访问repo,因此无法通过ssh直接重置它。

我认为您无法直接访问/重置github上的任何内容,而无需询问他们。
Ie不允许他们查看您的GitHub回购的reflog。
通过创建新分支或将其重置为现有分支,他们将能够使丢失的SHA1可见

实际上,回购所有者可以查询GitHub事件API
见“”


确认、提及(和)作为理由:

这是故意的。
也就是说,当您意外地推送机密数据时,您可以倒回引用 在服务器上。
即使这些对象仍然存在于服务器上(直到它们被垃圾收集),也没有人能够获取您的秘密内容,即使它们碰巧知道SHA1

在他的评论中确认如下:

我做了更多的测试,发现克隆行为因使用的协议而异

  • 通过SSH(可能是通过git协议)进行克隆的行为如您所述;i、 e.不可访问的提交不会传输到克隆。
    现在我也用HTTPS(使用GitHub本身)对其进行了测试。而且看起来不太好;克隆不会获取无法访问的对象

  • 但是,在本地克隆时,所有提交(无论是否无法访问)都会被传输

(但OP澄清,这只是因为在使用本地克隆时,默认情况下,
.git/objects/
目录下的文件是硬链接的,以尽可能节省空间。

git克隆--无硬链接file:///Users/yourUser/your/full/repo/path repo clone name
不会传输无法访问的提交)

您是否尝试过将GitHub repo克隆到新的本地存储库?我相信克隆可能包含“丢失”的对象。然后,您将在新克隆的repo中拥有“丢失”的对象。您可以在本地执行重置,然后将固定引用推回GitHub。

您是否尝试过git push--force origin:master?
这应该将源代码上的master设置为指向您提供的任何SHA,不需要任何问题。

您确定本地文件上没有提交哈希吗?你试过检查吗?是的,我确定。我试着检查了它,也检查了reflog,只是做了一个
git日志
,我没有。Github允许您通过点击按钮在服务器上进行合并(其他人也确实点击了按钮),但是如果在Github上完成合并后没有人执行
git fetch
,那么Github的reflog是唯一一个在您做了像我这样愚蠢的事情时提交的。谢谢Dan,不幸的是,这不起作用。您无法获取任何不是由分支或标记指向的提交(或其祖先)指向的内容。我的理解是,这是git的一个“安全特性”,因此,如果您意外地提交了一些敏感的内容(如密码),您可以将其从历史记录中删除,而某些人即使找到了SHA也无法检索到它。我希望github有一个解决方案,它不涉及联系人类,但听起来好像没有。@Ted:在我做的一个快速测试中,克隆存储库检索到了任何分支或引用都无法访问的对象。我不相信在封面下获取和克隆是完全相同的操作。你试过了吗?@Ted:我做了更多的测试,发现克隆行为因使用的协议而异。通过SSH(可能是通过git协议)进行克隆的行为如您所述;i、 e.不可访问的提交不会传输到克隆。但是,在本地克隆时,所有提交(无论是否无法访问)都会被传输。我不确定是否通过HTTP进行克隆,因为我不能很容易地测试它。@TedNaleid:现在我也用HTTPS(使用GitHub本身)进行了测试。而且看起来不太好;克隆不会获取无法访问的对象。事实上,GitHub支持人员的手动干预似乎是唯一的解决方案。我已经在我的答案中加入了你的测试,以提高可视性。谢谢,这正是我害怕的。您不能这样做,原因与您相同。本地克隆“工作”以保留的原因是因为本地文件系统上的硬链接实际上没有被复制。如果使用
git clone克隆clean,则无硬链接file:///Users/yourUser/your/full/repo/path repo clone name
您正在复制远程cl的行为