我想确认一下 Git 垃圾回收的理解是否正确。
假设您有两个分支:master 和 newidea。在某个时间点上,您将 newidea 合并到 master 中,并删除了 newidea 分支。
您在处理 newidea 分支时所做的提交将永远不会被垃圾回收,因为它们现在是 master 树的一部分,对吗?
相反,如果您没有合并,那么这些相同的提交最终会被垃圾回收,因为它们不再可以通过活跃的分支访问到。
我的理解正确吗?
我想确认一下 Git 垃圾回收的理解是否正确。
假设您有两个分支:master 和 newidea。在某个时间点上,您将 newidea 合并到 master 中,并删除了 newidea 分支。
您在处理 newidea 分支时所做的提交将永远不会被垃圾回收,因为它们现在是 master 树的一部分,对吗?
相反,如果您没有合并,那么这些相同的提交最终会被垃圾回收,因为它们不再可以通过活跃的分支访问到。
我的理解正确吗?
是的,你说得对1。孤立的提交……也就是未被分支或标签引用的提交,在一定时间(可配置)后将被垃圾回收。
被直接分支或标签引用或通过其他已引用提交的提交历史间接引用的提交都将被保留,不会被垃圾回收。
垃圾回收不仅针对提交。各种管道命令可以创建文件和树,由于各种原因可能不会被提交引用。这些对象也将被垃圾回收。
有关更多信息,请参阅git-gc
的文档,具体内容如下:
git gc
会尽最大努力不删除存储在仓库中任何位置的引用对象。特别地,它不仅会保留当前分支和标签引用的对象,还会保留索引、远程跟踪分支、由 git filter-branch 保存在 refs/original/ 中或引用了重写或回退分支提交的 reflogs 中的引用。如果您希望删除某些对象但它们没有被删除,请检查所有这些位置,并决定是否在您的情况下删除这些引用。
1 一个需要注意的地方是,虽然标准的git merge
命令会保留对源提交的引用(因此即使源分支最终被删除,也会保留两个分支中的提交),但还有其他合并提交/分支的方式不会保留对原始提交的引用,例如git cherry-pick
、git rebase
或git merge --squash
。如果使用这些命令之一,则在问题分支被删除后,将保留原始提交的实质内容(内容、作者、日期等),但不是提交本身。
git gc
文档可能需要更新),Git将查找通过git worktree add
添加的任何附加索引和分离的HEAD
引用。 - torek