我想在这里检查一下我对Git垃圾收集的理解。
假设您有两个分支:master和newidea。在某一时刻,您将newidea合并为master,并删除分支newidea。
你在newidea上做的提交永远不会被垃圾收集,因为它们现在是合并的主树的一部分,对吧?
相比之下,如果您从未合并过,那些相同的提交最终将被垃圾收集,因为它们不再可以从活动分支中获取。
我有这个权利吗?
答案 0 :(得分:2)
是的,你是正确的 1 。孤立提交...未被分支或标记引用的提交在一定(可配置)的时间长度后被垃圾收集。
通过分支或标记直接引用或通过另一个引用的提交的提交历史间接引用的提交将被保留,并且不会被垃圾回收。
这不仅是垃圾收集的提交。各种管道命令可以创建文件和树,由于各种原因,提交可能不会引用这些文件和树。这些对象也将被垃圾收集。
有关详细信息,请参阅git-gc
的文档,特别是:
git gc
非常努力地不删除存储库中任何位置引用的对象。特别是,它不仅会保留当前分支和标记集引用的对象,还会保留索引引用的对象,远程跟踪分支,refs / original /中git filter-branch保存的引用,或者reflogs(可能在后来修改或重绕的分支中的引用提交)。如果您希望某些对象被删除而它们不是,请检查所有这些位置,并确定在您的情况下删除这些引用是否有意义。
1 一个警告:标准git merge
将保留对两个源提交的引用(因此保留两个分支中的提交,即使源分支最终被删除),是“合并”提交/分支的其他方法,它不会保留对原始提交的引用,例如git cherry-pick
,git rebase
或git merge --squash
。如果您使用这些命令之一,则在删除问题分支后,您将保留原始提交的内容(内容,作者,日期等),但不保留提交本身。
另请注意,即使您使用合并和壁球等,一些git服务器(如GitHub)实际上create a shadow branch for PRs,所以虽然原始提交可能在本地计算机上进行了gc-ed,但它们可能会继续存在于服务器上。