我做了一个错误的提交,并将其推送到我的私有(private) bitbucket.org 存储库。如何从远程存储库的历史记录中完全删除此提交?
我尝试了以下方法:
git reset --hard HEAD~1
git reset HEAD~
git commit -m "some message"
git push -f
我是根据 Bitbucket git reset 的解决方案做的
然而,以前的提交可以通过 Bitbucket 的网络界面访问。
我的意思是它们仍然可以使用像 https://bitbucket.org/user/repo/commits/<deleted commit hash>
这样的链接访问(尽管它们未在 Web 界面的存储库提交中列出)。
此信息(我打算删除的历史记录)是从我的存储库中提取的吗?
或者
- 这是 bitbucket.org 的一些功能吗?
- 我有没有做错某些步骤?哪个?
- 如何从 bitbucket.org 的历史记录中完全删除提交?
最佳答案
这是 BitBucket 和 Git 本身的组合功能。 Git 提交是不可变的对象。您不能移动它们在历史图中的位置,只能在其他位置创建新的提交,并且有时会删除大量的提交。
分支只是一个移动标签(标签是静态标签,绑定(bind)到提交)。当一个分支是 HEAD 时,您所做的任何提交都会将标签与它们一起移动。您可以将相同的标签移动到图形的不相关部分,不一定只是向前和向后移动。当你 rebase 时,这正是发生的事情。与原始内容(大部分)相同的新提交是在新的基础上创建的,并且分支标签被移动以指向它们。您始终可以清除不属于本地存储库分支的未引用提交。
当你在本地工作时,这一切都很好。一旦开始使用 Remote ,您就必须开始考虑到您可能不是唯一使用该存储库的人。一旦你强制推送了一个 rebase 分支,就会发生一些事情:
- 新创建的提交被推送到远程
- 您正在跟踪的分支的远程分支标签已更新为新提交
旧分支中的提交不再被你或服务器引用,但它们仍然存在。事实上,克隆你的 repo 的任何其他用户仍然会在他们的本地版本中指向这些提交,直到他们明确地更改他们的历史记录。事实上,如果他们要进行强制推送,分支标签会直接移回原来的位置,丢弃你的 rebase。
Git 不会对您克隆的存储库强加层次结构。每一个都与其他任何代码一样代表您的代码的真实状态。出于这个原因,显然未使用的提交会保留一段时间,即使它们没有出现在本地分支的历史记录中。话虽这么说,如果这些未引用的提交达到一定年龄而没有获得新的后代,git 可以定期修剪这些提交。
根据以上信息,您没有做错任何事情。如果没有明确引用其哈希,将不会克隆已删除的提交。如果您将提交放置足够长的时间,很有可能会自动清除它。如果这足够好,你可以顺其自然。另一方面,如果您确实需要删除该提交,请继续阅读。
确保代码库干净的最可靠方法是从头开始。您可以创建一个本地存储库,该存储库经过修剪、清除并且通常符合您的规范。完成后,您可以删除服务器副本。然后,使用原始名称创建一个新的空存储库,并将您的原始历史记录推送到其中。
关于git - 从 Bitbucket 历史中完全删除提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25874104/