完全删除Bitbucket历史记录中的提交

Nim*_*ima 6 git bitbucket

我做了一个错误的提交,然后将它推送到我的私人bitbucket.org存储库.如何从远程存储库的历史记录中完全删除此提交?

我尝试了以下方法:

git reset --hard HEAD~1
git reset HEAD~
git commit -m "some message"
git push -f
Run Code Online (Sandbox Code Playgroud)

我是根据Bitbucket git reset的解决方案做到的

然而,以前的提交可以通过Bitbucket的Web界面访问.
我的意思是它们仍然可以使用类似的链接访问https://bitbucket.org/user/repo/commits/<deleted commit hash>(尽管它们未在Web界面中的存储库提交中列出).

是否从我的存储库中获取了此信息(我打算删除的历史记录)?

要么

  1. 这是bitbucket.org的一些功能吗?
  2. 我采取了一些错误措施吗?哪一个?
  3. 如何在bitbucket.org上完全删除历史记录中的提交?

Mad*_*ist 5

  1. 这是 BitBucket 和 Git 本身的组合功能。Git 提交是不可变的对象。您无法移动它们在历史图中的位置,只能在其他位置创建新的提交,有时还删除大量提交。

    分支只是一个移动标签(标签是一个静态标签,与提交绑定)。当分支处于 HEAD 状态时,您所做的任何提交都会将标签随之移动。您可以将相同的标签移动到图表中不相关的部分,而不必只是向前和向后移动。当你变基时,这正是发生的事情。在新的基础上创建与原始内容(大部分)相同的新提交,并且分支标签被移动以指向它们。您始终可以清除不属于本地存储库上的分支的未引用提交。

    当您在本地工作时,这一切都很好。一旦开始使用遥控器,您就必须开始考虑到您可能不是唯一使用该存储库的人。一旦你强制推送了一个重新定位的分支,就会发生一些事情:

    1. 新创建的提交被推送到远程
    2. 您正在跟踪的分支远程上的分支标签已更新为新提交

    旧分支中的提交不再被您或服务器引用,但它们仍然存在。事实上,克隆您的存储库的任何其他用户仍然会在其本地版本中指向这些提交,直到他们明确更改其终端的历史记录。事实上,如果他们要进行强制推送,分支标签将立即移回原来的位置,从而丢弃您的变基。

    Git 不会对您克隆的存储库强加层次结构。每一个都与其他任何一个一样都代表了代码的真实状态。因此,显然未使用的提交会保留一段时间,即使它们没有出现在本地分支的历史记录中。话虽这么说,如果这些未引用的提交达到一定年龄而没有获得新的后代,git 可以定期修剪它们。

  2. 根据以上信息,您没有做错任何事情。如果没有明确引用其哈希值,则不会克隆已删除的提交。如果您将提交放置足够长的时间,它很可能会被自动清除。如果这足够好,你就可以顺其自然。另一方面,如果您确实需要删除该提交,请继续阅读。

  3. 确保干净的仓库的最可靠方法是从头开始。您可以创建一个经过修剪、清除并且通常符合您的规范的本地存储库。完成此操作后,您可以删除服务器副本。然后,使用原始名称创建一个新的空存储库,并将原始历史记录推送到其中。