如何在git中硬删除孤儿提交?

yftpprvb  于 2023-02-14  发布在  Git
关注(0)|答案(3)|浏览(154)

我有本地提交不在我想删除的分支上,我不想重定它们的基,我真的想删除它们,并释放所有与这些提交相关的内容。
这是命令吗?
到目前为止,我已经尝试了很多人建议的交互式rebase,但它只是移动提交,并不删除它们。我也尝试过使用reflog delete,但我不知道如何将特定的提交ID传递给命令。
下面是工作树:

o [master] Commit #6  
|  
o Commit #5  
|  
| o Commit #4  
|/  
o Commit #3  
|  
o Commit #2  
|  
o Commit #1

我想物理删除提交#4。

au9on6nz

au9on6nz1#

如果提交没有被任何东西引用,它会被git的垃圾回收及时移除。
如果要在手动之前强制执行,请使用git gc --prune=now --aggressive

wwtsj6pe

wwtsj6pe2#

要完全删除一个提交,您需要删除对它的所有引用,然后强制执行一个积极的垃圾收集。
如果仍然有分支指向提交,请先删除这些分支。
接下来,你需要刷新reflog中的提交,reflog默认情况下会引用你在过去90天内访问过的每一个提交(用提交哈希的前8个字符替换[commit-hash]):

git reflog --all | grep [commit-hash] | cut -d' ' -f2 | cut -d':' -f1 | tac | xargs git reflog delete

(我使用tac来颠倒删除的顺序,因为如果提交在reflog中出现多次,删除一个条目会移动它后面的所有条目)
最后,强制垃圾回收:

git gc --prune=now --aggressive

在此之后,git show [commit-hash]将不再显示提交,因此您将知道它确实被删除了。

x759pob2

x759pob23#

要删除一个提交,你只需要确保它不再是任何分支的一部分。也就是说,对于仓库中的每个分支,确保错误提交不属于定义该分支的子到父提交链。如果你找到这样的分支,要么删除它,要么修改它的历史记录,使其不再包含错误提交。
一旦这是真的,错误提交最终将被垃圾收集。

相关问题