git - 从 Bitbucket 历史中完全删除提交

标签 git bitbucket

我做了一个错误的提交,并将其推送到我的私有(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 界面的存储库提交中列出)。

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

或者

  1. 这是 bitbucket.org 的一些功能吗?
  2. 我有没有做错某些步骤?哪个?
  3. 如何从 bitbucket.org 的历史记录中完全删除提交?

最佳答案

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

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

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

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

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

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

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

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

关于git - 从 Bitbucket 历史中完全删除提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25874104/

相关文章:

curl - 如何使用 curl 创建 bitbucket 存储库?

Git 设置允许强制更新某些分支

git - 突然无法创建本地/远程 git 分支

git - Bitbucket: fork 到现有存储库

git - AWS EC2 实例无法连接到 bitbucket.org

windows - 将默认的 git 源添加到 visual studio?

git - 请求的URL返回错误: 403 in git repository如何解决

git - 授予对 github 存储库部分内容的访问权限

Git 无法锁定 ref 'HEAD' : unable to resolve reference HEAD

git - hudson 无法从 git 存储库中获取