从Git仓库中删除一个未被引用的提交

8

我有一个像这样的git提交历史:

          U
         / 
A---B---C---D---E master

我知道一个提交的哈希值,但没有指向该提交的任何内容U。如果我想要完全删除这个提交,就好像它从未存在过一样,该怎么做呢?我是唯一使用这个仓库的人。

我尝试使用git rebase,但它只能删除分支的部分或移动提交,似乎不能删除单个提交。

如果我执行git checkout <hash>,然后 git reset --hard HEAD~1,我就看不到这个提交了。它是否真的已经完全删除了,还是仍然隐藏在仓库中?

2个回答

19

此处所述,只需使用

git reflog expire --expire-unreachable=now --all
git gc --prune=now

git reflog expire --expire-unreachable=now --all会清除reflog中所有不可达提交的引用。

git gc --prune=now会清除提交本身。

注意:仅使用git gc --prune=now是不起作用的,因为这些提交仍然在reflog中被引用。因此,清除reflog是必要的。


5
最终它将被git清理,但您可以查看 git gc来强制进行垃圾回收。 clean命令不同,不能为您处理这个问题。

如果我克隆整个存储库会怎样?未引用的垃圾对象也会被克隆吗? - Jawap
@Jawap:不,它们不会被克隆。 - Chronial

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接