如何从git历史中完全删除提交

时间:2013-11-11 19:43:27

标签: git

我不得不从本地git repo中删除最后5次提交,我通过reset --hard删除了新的HEAD提交:

git reset --hard abcde1

现在我需要从历史记录中删除那些未引用的提交,在阅读了很多答案后,我尝试运行以下内容。

git gc --prune=now

git prune --expire=now --agressive

我找到的答案似乎都不适合我,例如我仍然可以看到git show <sha>的提交,我在这里缺少什么?是否可以完全从历史记录中删除提交?

最后,如果我推动一个新的起源(让我们说它是一个全新的回购),这些未引用的提交是否也被推了?

3 个答案:

答案 0 :(得分:3)

未引用或孤立的提交不会被推送到原点。这些提交将在某个时候被git的垃圾收集删除。如果要强制执行垃圾收集,请执行此操作

git config gc.reflogexpireUnreachable = now
git gc --prune=now
git config gc.reflogexpireUnreachable = "2 days"

答案 1 :(得分:0)

查看gitscm它有关于如何完全删除资源的良好资源。但是,我认为你关于推动新起源的问题会导致更简单的解决方案。

您正在推送的分支中的提交中未引用的对象不会发送到服务器。我建议将repo克隆到一个干净的目录中,从你现有的目录中拉出来然后推送到你想要的任何目的地。它将为您提供一个干净的.git目录,只包含引用的对象。

答案 2 :(得分:0)

你想从历史中“删除”吗?你可以做到这一点,但是如果有人已经把这些变化拉了下来,那么他们将会有一段有趣的历史。

所以,您可能想要做的是

git reset --hard <sha1-commit-id>//the commit you want to get rid of
git push origin HEAD --force

在此之前,请进行备份! 再说一次,如果有人已经撤消了你的修改,那么请准备好听恐怖故事。