reset --hard git远程分支到远程reflog中的SHA但不在本地repo中

时间:2012-07-16 02:18:34

标签: git github branch reset

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

我非常熟悉重置(软/混合/硬)如何在本地仓库上运行,但这对我没有帮助。

以下是我正在努力修复的情况。我有一段时间没有完成一次获取,远程主机已经更新了我在本地没有的合并。

我搞砸了git push --force意思是只更新远程功能分支但忘记了一个参数,最后强制功能分支和主服务器到我本地的修订版。

这意味着master现在错过了自上次提取以来发生的合并提交。我们正在使用github,所以我收到一封电子邮件,告诉我主人之前的SHA。我还能够访问网址,看到提交仍在那里(还没有收集垃圾)。

我能够通过重做我丢失的合并并再次推出它来“修复”它(最终改变了SHA,因为它是一个不同的提交者和时间)。这不是最佳的,如果我在master上缺少多个合并提交,可能会更糟糕。

我想要做的只是reset --hard远程主分支到它应该在的SHA。如果没有SSH访问回购,有没有办法做到这一点?

这是在github上,所以我没有直接访问repo能够在那里ssh并直接重置它。

3 个答案:

答案 0 :(得分:4)

我不认为您可以直接访问/重置GitHub上的任何内容,而无需询问
即没有contacting GitHub support,他们可以查看您的GitHub仓库的reflog 他们将能够通过创建新分支或将其重置为现有分支来使丢失的SHA1可见。

实际上,回购所有者可以查询GitHub事件API 请参阅“Does github remember commit IDs?”。


OP Ted Naleid确认,提及this thread(和this one)是一个原因:

  

这是设计的   也就是说,当您不小心推送秘密数据时,您可以倒回您的裁判   在服务器上。
  即使对象仍然存在于服务器上(直到它们被垃圾收集),即使他们碰巧知道SHA1,也没有人能够获取你的秘密内容。

Dan Moulding在其own answer

的评论中确认如下
  

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

     
      
  • 通过SSH克隆(可能是通过git协议),就像你所描述的那样;即无法到达的提交不会转移到克隆   现在我也用HTTPS测试了它(使用GitHub本身)。它看起来不太好;克隆不会得到无法访问的对象。

  •   
  • 在本地克隆,但是,所有提交 - 无法访问或不可访问 - 都会被传输。

  •   

(但是OP澄清了这只是因为,对于本地克隆,默认 .git/objects/目录下的文件是硬链接的,以便在可能的情况下节省空间。
git clone --no-hardlinks file:///Users/yourUser/your/full/repo/path repo-clone-name不会传输无法访问的提交)

答案 1 :(得分:3)

你试过git push --force origin <sha>:master吗? 这应该设置master on origin指向你给它的SHA,没有问题。

答案 2 :(得分:1)

您是否尝试将GitHub仓库克隆到新的本地存储库?我相信克隆可能包含“丢失”的对象。然后,您将在新克隆的仓库中拥有“丢失”的对象。您可以在本地进行重置,然后将修复的refs推回GitHub。