如果你合并了一个分支然后删除它,那么它的提交记录是否会被垃圾回收?

6

我想确认一下 Git 垃圾回收的理解是否正确。

假设您有两个分支:master 和 newidea。在某个时间点上,您将 newidea 合并到 master 中,并删除了 newidea 分支。

您在处理 newidea 分支时所做的提交将永远不会被垃圾回收,因为它们现在是 master 树的一部分,对吗?

相反,如果您没有合并,那么这些相同的提交最终会被垃圾回收,因为它们不再可以通过活跃的分支访问到。

我的理解正确吗?

1个回答

5

是的,你说得对1。孤立的提交……也就是未被分支或标签引用的提交,在一定时间(可配置)后将被垃圾回收。

被直接分支或标签引用或通过其他已引用提交的提交历史间接引用的提交都将被保留,不会被垃圾回收。

垃圾回收不仅针对提交。各种管道命令可以创建文件和树,由于各种原因可能不会被提交引用。这些对象也将被垃圾回收。

有关更多信息,请参阅git-gc的文档,具体内容如下:

git gc会尽最大努力不删除存储在仓库中任何位置的引用对象。特别地,它不仅会保留当前分支和标签引用的对象,还会保留索引、远程跟踪分支、由 git filter-branch 保存在 refs/original/ 中或引用了重写或回退分支提交的 reflogs 中的引用。如果您希望删除某些对象但它们没有被删除,请检查所有这些位置,并决定是否在您的情况下删除这些引用。


1 一个需要注意的地方是,虽然标准的git merge命令会保留对源提交的引用(因此即使源分支最终被删除,也会保留两个分支中的提交),但还有其他合并提交/分支的方式不会保留对原始提交的引用,例如git cherry-pickgit rebasegit merge --squash。如果使用这些命令之一,则在问题分支被删除后,将保留原始提交的实质内容(内容、作者、日期等),但不是提交本身。

请注意,即使您使用合并和压缩等操作,一些git服务器(如GitHub)实际上会为PR创建一个影子分支,因此尽管原始提交可能在本地机器上被垃圾回收,但它们可能仍然存在于服务器上。

1
值得一提的是(并且git gc文档可能需要更新),Git将查找通过git worktree add添加的任何附加索引和分离的HEAD引用。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接