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

Commits are left behind when branch is deleted after merge

考虑以下合并:

删除 'testmerge' 分支后,它的提交仍然存在。

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

您的问题很可能源于对 Git 工作原理的误解。

在 Git 中,分支只是指向提交的指针。删除分支可能会导致提交 unreachable(在这种情况下它们不会出现在您的 GitHub 图表上),但前提是相关提交 not 包含在任何其他现有引用(分支或标记)的祖先中。此外,提交对象的垃圾收集/修剪仅适用于这些对象 unreachable.

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

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

请注意,提交 BCD 尤其可以从 testmerge 访问;换句话说,它们包含在分支 testmerge(提交 D)顶端的 ancestry 中。但是,它们也是分支 development(提交 E)尖端的祖先。因为这三个提交可以从 development 访问,删除 testmerge 不会使它们成为 "go away":

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

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

只要开发分支处于活动状态(或合并到另一个活动分支中,或作为标记历史记录的一部分),这些提交将永远不会被删除。

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

由于您的开发分支上的 HEAD 提交引用了 testmerge 分支的前 HEAD 提交,因此该分支是 "kept alive"。

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

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

此外,如果这是不可取的,请考虑在将来进行快进合并之前将分支变基并压缩为单个提交。