3

我不得不从本地 git repo 中删除最后 5 个提交,我这样做是通过reset --hard新的 HEAD 提交:

git reset --hard abcde1

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

git gc --prune=now

git prune --expire=now --agressive

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

最后,如果我推送到一个新的来源(假设它是一个全新的仓库),那些未引用的提交是否也会被推送?

4

3 回答 3

4

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

git config gc.reflogexpireUnreachable = now
git gc --prune=now
git config gc.reflogexpireUnreachable = "2 days"
于 2013-11-11T20:03:37.733 回答
0

你想真正从历史中“删除”吗?你可以这样做,但如果有人已经取消了这些更改,那么他们将在他们的历史上度过一段有趣的时光。

所以,你可能想要做的是

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

在执行此操作之前,请进行备份!同样,如果有人已经取消了您的更改,那么请准备好听恐怖故事。

于 2013-11-11T20:07:27.880 回答
0

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

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

于 2013-11-11T20:04:59.423 回答