删除已从提交历史记录中推送的提交

时间:2021-04-24 16:31:40

标签: git github git-rebase

[为了完整起见:我在一个环境中,我从一个本地副本访问一个私人存储库,我可以单独访问它。在此特定设置中,与其他用户甚至存储库的克隆版本无关。]

我一直在想如何从目录中完全删除一系列提交。

重要的是我并不是在功能上试图撤消提交(即,我想将 repo 恢复到没有提交的状态,可能使用反向提交),我正在尝试具体删除提交(即,我不希望它再出现在提交历史记录中)。我找到了很多答案,它们要么解释了如何在本地执行此操作,要么解释了如何在功能上远程恢复 — 但没有解释如何从历史记录中完全删除提交。

这是因为为了调试持续集成,我做了 40 次提交,我想压缩。

怎么能这样呢?同样,提交都被推送到了一个仓库,我想从历史记录中删除这些提交。 (如果我可以将所有更改合并到一个提交中就好了,但我的主要重点是删除提交历史,以便我可以在必要时手动重新引入更改。)

这是一个示例存储库,假设我想删除或压缩前 10 个提交: https://github.com/jlumbroso/push-generated-file/commits/main

谢谢!

2 个答案:

答案 0 :(得分:3)

您可以通过使用 git rebase -i BASE_COMMIT 压缩提交来做到这一点。这将打开一个编辑器,您可以在其中将第一次提交保留在 pick 并将其余部分更改为 squash,然后保存并退出。系统将提示您编辑该最终提交的提交消息。

这将导致一次提交包含这 40 次提交中的所有更改。

然后您需要对远程服务器进行强制推送(例如 git push -f origin branch)以推送重新定位的分支。请注意,GitHub 默认不运行 git gc,因此任何知道其中一个提交的原始提交 ID 的人仍然可以查看它,但它不会成为任何分支的一部分。

答案 1 :(得分:2)

这很容易做到,只需在本地进行更改,然后强制推送即可。最简单的就是这样。

git reset --hard <commit>
git push -f

但是,您需要了解后果。虽然您可以从 github 上的分支中删除提交,但不能从用户的本地分支中删除它们。当您的用户拉取时,他们的客户会尝试将您删除的提交与存储库中的任何新提交合并,这可能会导致可怕的混乱。

这就是不鼓励重写您之前发布的 git 历史记录的原因。