有没有办法将远程分支指针重置为您知道在远程reflog中的SHA,但是您在本地仓库中没有?
我非常熟悉重置(软/混合/硬)如何在本地仓库上运行,但这对我没有帮助。
以下是我正在努力修复的情况。我有一段时间没有完成一次获取,远程主机已经更新了我在本地没有的合并。
我搞砸了git push --force
意思是只更新远程功能分支但忘记了一个参数,最后强制功能分支和主服务器到我本地的修订版。
这意味着master现在错过了自上次提取以来发生的合并提交。我们正在使用github,所以我收到一封电子邮件,告诉我主人之前的SHA。我还能够访问网址,看到提交仍在那里(还没有收集垃圾)。
我能够通过重做我丢失的合并并再次推出它来“修复”它(最终改变了SHA,因为它是一个不同的提交者和时间)。这不是最佳的,如果我在master上缺少多个合并提交,可能会更糟糕。
我想要做的只是reset --hard
远程主分支到它应该在的SHA。如果没有SSH访问回购,有没有办法做到这一点?
这是在github上,所以我没有直接访问repo能够在那里ssh并直接重置它。
答案 0 :(得分:4)
我不认为您可以直接访问/重置GitHub上的任何内容,而无需询问。
即没有contacting GitHub support,他们可以查看您的GitHub仓库的reflog
他们将能够通过创建新分支或将其重置为现有分支来使丢失的SHA1可见。
实际上,回购所有者可以查询GitHub事件API 请参阅“Does github remember commit IDs?”。
OP Ted Naleid确认,提及this thread(和this one)是一个原因:
的评论中确认如下这是设计的 也就是说,当您不小心推送秘密数据时,您可以倒回您的裁判 在服务器上。
即使对象仍然存在于服务器上(直到它们被垃圾收集),即使他们碰巧知道SHA1,也没有人能够获取你的秘密内容。
我做了更多测试,发现克隆行为因使用的协议而异。
通过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。