合并后删除分支时会留下提交

时间:2015-02-24 14:21:24

标签: git garbage-collection branch

考虑以下合并:

merged code

删除'testmerge'分支后,其提交仍然落后。

deleted branch

这些提交是否会被删除(垃圾回收)?远程修剪似乎没有删除它们......

2 个答案:

答案 0 :(得分:4)

你的问题很可能源于对Git如何运作的误解。

在Git中,分支只是提交的指针。删除分支可能会使提交无法访问(在这种情况下,它们不会出现在您的GitHub图上),但前提是有问题的提交包含在任何祖先中其他现有参考(分支或标签)。此外,只有当这些对象无法访问时,才会应用提交对象的垃圾收集/修剪。

在这种情况下,根据您的屏幕截图,repo看起来如下(在删除testmerge之前):

-- A ----------- E [development]
    \           /
     B -- C -- D [testmerge]

请注意,提交BCD特别是可以从testmerge到达;换句话说,它们包含在分支testmerge的提示的祖先中(提交D)。但是,它们也是分支development(提交E)的尖端的祖先。因为可以从development访问这三个提交,所以删除testmerge不会使他们#34;离开":

-- A ----------- E [development]
    \           /
     B -- C -- D

因为这些提交仍然可以访问(来自development),所以运行Git的垃圾收集机制不会影响它们。

答案 1 :(得分:2)

只要开发分支处于实时(或合并到另一个实时分支,或作为标记历史的一部分包含在内),这些提交将永远不会被删除。

原因是git提交实际上是对象,每个对象都引用了存储库的当前状态,作者和提交者信息,提交消息,当然还有父提交或提交(在合并提交的情况下) )

由于您的开发分支上的HEAD提交引用了testmerge分支的前HEAD提交,因此该分支保持活动状态"。

您可能会觉得有用的Git对象的参考: http://git-scm.com/book/en/v2/Git-Internals-Git-Objects

您可能对修剪历史的各种问题感兴趣: How do I remove the old history from a git repository?

此外,如果这是不合需要的,请考虑在将来进行快速合并之前将您的分支重新定位并压缩到单个提交。