我有本地提交不在我想删除的分支上,我不想重定它们的基,我真的想删除它们,并释放所有与这些提交相关的内容。
这是命令吗?
到目前为止,我已经尝试了很多人建议的交互式rebase,但它只是移动提交,并不删除它们。我也尝试过使用reflog delete,但我不知道如何将特定的提交ID传递给命令。
下面是工作树:
o [master] Commit #6
|
o Commit #5
|
| o Commit #4
|/
o Commit #3
|
o Commit #2
|
o Commit #1
我想物理删除提交#4。
3条答案
按热度按时间au9on6nz1#
如果提交没有被任何东西引用,它会被git的垃圾回收及时移除。
如果要在手动之前强制执行,请使用
git gc --prune=now --aggressive
wwtsj6pe2#
要完全删除一个提交,您需要删除对它的所有引用,然后强制执行一个积极的垃圾收集。
如果仍然有分支指向提交,请先删除这些分支。
接下来,你需要刷新reflog中的提交,reflog默认情况下会引用你在过去90天内访问过的每一个提交(用提交哈希的前8个字符替换[commit-hash]):
(我使用
tac
来颠倒删除的顺序,因为如果提交在reflog中出现多次,删除一个条目会移动它后面的所有条目)最后,强制垃圾回收:
在此之后,
git show [commit-hash]
将不再显示提交,因此您将知道它确实被删除了。x759pob23#
要删除一个提交,你只需要确保它不再是任何分支的一部分。也就是说,对于仓库中的每个分支,确保错误提交不属于定义该分支的子到父提交链。如果你找到这样的分支,要么删除它,要么修改它的历史记录,使其不再包含错误提交。
一旦这是真的,错误提交最终将被垃圾收集。