如何在git中删除孤立提交?

FMa*_*008 27 git

我有本地提交,不在我想要删除的任何分支上.我不想重新定义它们,我真的想删除它们,并且丢失与这些提交相关的所有内容.

他们是这样做的命令吗?

到目前为止,我已经尝试了许多建议的交互式rebase,但它只是移动提交,它不会删除它们.我也尝试使用reflog delete,但我无法弄清楚如何将特定的提交ID传递给命令.

这是工作树:

o [master] Commit #6  
|  
o Commit #5  
|  
| o Commit #4  
|/  
o Commit #3  
|  
o Commit #2  
|  
o Commit #1  
Run Code Online (Sandbox Code Playgroud)

我想删除提交#4.

And*_*ndy 37

如果提交没有被任何引用,它将被及时使用git的垃圾收集删除.

如果你想提前强制它,请使用 git gc --prune=now --aggressive

  • 它可能仍在 HEAD 的 reflog 中,因为您最近检查过它,这意味着 git 无法对其进行 GC。没有真正的理由如此迫切地删除提交的所有副本,因为它无法从任何分支访问,但是如果您绝望,您可能会弄乱引用日志。参见`git help reflog`。 (2认同)

Tam*_*inn 7

要完全删除提交,您需要删除对其的所有引用,然后强制进行积极的垃圾收集。

如果仍有分支指向提交,请先删除它们。

接下来,您需要从引用日志中刷新提交,默认情况下,引用日志保留对您在过去 90 天内访问过的每个提交的引用(将 [commit-hash] 替换为提交哈希的前 8 个字符):

git reflog --all | grep [commit-hash] | cut -d' ' -f2 | cut -d':' -f1 | tac | xargs git reflog delete
Run Code Online (Sandbox Code Playgroud)

(我曾经tac颠倒删除的顺序,因为如果提交在引用日志中多次出现,则删除一个条目会移动其后面的所有条目)

最后,强制垃圾回收:

git gc --prune=now --aggressive
Run Code Online (Sandbox Code Playgroud)

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