git删除旧分支与--no-ff合并

时间:2017-03-24 15:38:29

标签: git branch git-merge

我正在管理我的仓库并希望删除一些不再使用的旧分支。关于如何删除它们有plenty info。但是,我不确定这些解决方案对我来说是否安全,因为我使用--no-ff合并了分支。

想象一下,我的日志如下所示:

master     *--*--*--------*--*--*--*
               \         /     /
                \       /     |
feature_a        *--*--*      |  
                     \        |
                      \       /
feature_b              *--*--*

问题:如何在不丢失数据和日志结构的情况下删除feature_afeature_b分支?

基本上我希望git branch仅返回*master,日志图仍然如上所示(即没有重写feature_a和{{的提交1}}到_b)。

1 个答案:

答案 0 :(得分:3)

您需要做的就是删除额外的分支名称(例如git branch -d feature_a feature_b)。提交本身是安全的,受分支名称master保护。联系问题的接受答案是实现自动化的一种方法。

我认为,以不同的方式绘制分支是有帮助的,因为Git的工作方式不同(来自大多数其他版本控制系统,以及您正在考虑的内容)。而不是:

master     *--*--*--------*--*--*--*
               \         /     /
                \       /     |
feature_a        *--*--*      |  
                     \        |
                      \       /
feature_b              *--*--*

像这样画出来:

*--*--*--------M--*--m--*    <-- master
    \         /     /
     *---*---*  <- / ------ feature_a
          \       /
           *--*--*   <-- feature_b

这样做的原因是 Git如何工作名称实际上直接指向特定的提交。 Git将这三个分支提交称为三个分支的 tip 提交。提交自己 - 所有;图中的所有*都是自己存在的;但是从其中一个名字开始,它们找到了。该名称定位提示提交,然后Git从那里向后(向左)工作以找到分支上的其余提交。

合并提交 - 我在此图表中标记了两个字母Mm - 具有向后指向两个提交的功能。当Git向后提交时,它必须“同时”跟踪所有路径(或尽可能接近)。这意味着底行提交不仅在分支feature_b上,而且在分支master上也是。其中两个中间行提交位于所有三个分支上。

当您删除分支名称时,它指向的提交 - 其提示将丢失其名称。如果这是唯一的名称,您可以通过该名称找到该提交,它也会失去对Git的垃圾收集器git gc:GC的提交死神的保护=垃圾收集器,或者我喜欢称之为Grim Collector :-))。但如果它有一些其他分支名称,甚至标签或其他任何可以让你找到它的名称,它仍然受到保护。

提示提交的“后面”提交也是如此:如果它们从某个名称​​可到达,它们将受到Grim Collector的保护。因此名称确实有双重目的,但是一旦合并了分支提示,就不再需要“保护提交”的目的。 (当然,如果您添加 new 提交,会移动分支提示,并且其双重目的会恢复。)

请注意,origin/master之类的远程跟踪分支名称的工作方式完全相同,只是当您添加新提交时,它们不会移动,而是在{{1}时移动来自相应远程的新提交。