如何从git历史中删除未附加的提交

时间:2016-07-15 23:47:35

标签: git

我一直在寻找并且可能出现类似的情况。我有一个旧的回购,与任何人不共享,不知何故有一个完全不与任何其他分支挂钩的悬挂提交。如何从历史记录中删除它。提交树如下所示:

enter image description here

2 个答案:

答案 0 :(得分:1)

您可以使用git-gc运行Git垃圾收集器。

这应该删除你的悬挂提交,只要没有标签或分支指向其中任何一个。

引用official documentation

  

在当前存储库中运行许多内务处理任务,例如压缩文件修订版(以减少磁盘空间并提高性能)以及删除可能从先前调用git add创建的无法访问的对象。

答案 1 :(得分:1)

如果提交确实无法访问,则日志查看器不会首先显示它。像git log --graph --oneline这样的日志查看器的工作方式是从一些引用开始 - 通常是分支和/或标记,或者在命令行上传递的任何参数,但refs/命名空间中的任何引用都可以通过{ {1}}。要获得--all 装饰(使用分支和标记名称等注释)任何具有其中一个引用的提交,请添加git log --graph

您的显示看起来有点像--decorate的图形显示,虽然gitk通常会修饰每个引用的提交,以便您可以告诉它出现在图表中的原因。它看起来有点(更多)像TortoiseGit或SourceTree的显示,但我不使用这些(也很少使用gitk)所以我不能说如何让他们咳出原因

请注意,名为gitk --all的{​​{1}}使用的存储引用可以保留一系列其他被放弃的提交,例如git stash留下的提交,在存储库中存活,远远超过他们正常的恢复生命周期。如果你有旧的无用存储,你可能需要refs/stash他们。git rebase命令也复制它修改的所有引用,将原始文件留在git stash drop(所以例如,git filter-branch,分支refs/originals/的引用名称,当您通过过滤器复制来自{{的所有提交获得新的refs/heads/master时,将移至master 1}})。

除此之外,其他正常隐藏的引用都在Git的 reflogs 中,这些是在30天恢复期内保持放弃的提交,还有一些特殊的引用名称,如refs/originals/refs/heads/masterrefs/heads/mastermasterORIG_HEAD(当然还有MERGE_HEAD本身,但通常只包含分支名称。)

当提交链真正无法访问时,日志查看器将无法显示它,CHERRY_PICK_HEAD将收到它。