我做了错误的提交,然后将其推送到我的私人bitbucket.org存储库。如何从远程存储库的历史记录中完全删除此提交?
我尝试了以下内容:
git reset --hard HEAD~1
git reset HEAD~
git commit -m "some message"
git push -f
的解决方案做到的
然而,以前的提交可以通过Bitbucket的网络界面访问
我的意思是它们仍然可以使用像https://bitbucket.org/user/repo/commits/<deleted commit hash>
这样的链接访问(尽管它们未在Web界面的存储库提交中列出)。
这些信息(我打算删除的历史记录)是从我的存储库中提取的吗?
或者
答案 0 :(得分:1)
这是BitBucket和Git本身的组合功能。 Git提交是不可变的对象。您不能在历史记录图中移动它们的位置,只能在其他位置创建新的提交,有时甚至删除大量的提交。
分支只是一个移动标签(标签是与提交相关联的静态标签)。当分支为HEAD时,您进行的所有提交都将标签与它们一起移动。您可以将同一标签移动到图形的无关部分,而不必前后移动。当您变基时,这就是发生的情况。在新的基础上创建的内容(大多与原始内容相同)的新提交,并且分支标签移至指向它们的位置。您始终可以清除不属于本地存储库中分支的未引用提交。
在本地工作时一切都很好。一旦开始使用遥控器,就必须考虑到您可能不是唯一使用回购协议的人。一旦完成了对重新分支的分支的强制推送,就会发生以下几件事:
您或服务器不再引用旧分支中的提交,但它们仍然存在。实际上,任何其他克隆您的存储库的用户仍会在其本地版本中指向这些提交,直到他们明确更改其历史记录为止。实际上,如果他们要用力推动,则分支标签将立即移回原来的位置,从而放弃您的基准。
Git不会在克隆的存储库上施加层次结构。每个代码都代表了代码的真实状态。因此,显然未使用的提交会保留一段时间,即使它们没有出现在历史记录中的本地分支中也是如此。话虽如此,如果git达到一定的年龄而又没有新的后代,则git可以定期修剪这些未引用的提交。
鉴于上述信息,您没有做错任何事情。如果没有明确引用其哈希,将不会克隆已删除的提交。如果您将提交搁置足够长的时间,很有可能会自动清除。如果那足够好,您可以顺其自然。另一方面,如果您再次需要该提交,请继续阅读。
确保干净回购的最可靠方法是从头开始。您可以创建一个本地仓库,该仓库经过修剪,清除,并且通常符合您的规格。完成此操作后,您可以删除服务器副本。然后,使用原始名称创建一个新的空存储库,并将原始记录推送到该存储库。
答案 1 :(得分:0)
您可以通过删除提交并强制将更新的分支推送到远程来实现。注意:如果其他人结账,请小心。
假设您的历史记录如下,并且您要删除commit 200
:
commit 300
commit 200
commit 100
执行以下操作:
git rebase -i HEAD~3
现在,删除commit 200
。
保存文件,然后强制将分支推送到远程:
git push -f origin <branch_name>