[英]git remove old branches merge with --no-ff
我正在整理我的仓库,并想删除一些不再使用的旧分支。 有很多有关如何删除这些信息。 但是,我不确定这些解决方案对我是否安全,因为我使用--no-ff
合并了分支。
想象一下我的日志看起来像这样:
master *--*--*--------*--*--*--*
\ / /
\ / |
feature_a *--*--* |
\ |
\ /
feature_b *--*--*
问题:如何在不丢失数据和日志结构的情况下删除feature_a
和feature_b
分支?
基本上,我希望git branch
只返回*master
, 并且日志图仍然像上面一样(即,没有将feature_a
和_b
提交重写到master
)。
您需要做的就是删除多余的分支名称(例如git branch -d feature_a feature_b
)。 提交本身是安全的,并受到分支名称master
保护。 链接问题的可接受答案是使它自动化的一种方法。
我认为,以不同的方式绘制分支很有帮助,因为Git的工作方式不同(与大多数其他版本控制系统以及您的想法不同)。 代替:
master *--*--*--------*--*--*--*
\ / /
\ / |
feature_a *--*--* |
\ |
\ /
feature_b *--*--*
像这样绘制它们:
*--*--*--------M--*--m--* <-- master
\ / /
*---*---* <- / ------ feature_a
\ /
*--*--* <-- feature_b
这样做的原因是Git的工作方式 : 名称实际上直接指向特定的提交。 Git将这三个指向提交的提交称为三个分支的最尖端提交。 提交者自己- 全部 ; 图中的所有*
都独立存在; 但可以通过其中一个名称开头找到它们。 该名称找到了尖端提交,然后Git从那里向后(向左)工作,以找到分支上的其余提交。
合并提交-我在图中用字母M
和m
标记了两个-具有同时向后指向两个提交的功能。 当Git遵循向后提交时,它必须“同时”(或尽可能接近)遵循所有路径。 这意味着底部行提交不只是分支feature_b
, 而且对分支master
。 中行提交中的两个在所有三个分支上。
删除分支名称时,它指向的提交(即提示)将失去其名称 。 如果这是唯一可以找到该提交的名称,它也将失去对Git Reaper of Commits,Git的垃圾收集器 ( git gc
:GC =垃圾收集器,或者我喜欢称之为Grim Collector的保护): ))。 但是,如果它具有其他一些分支名称,甚至是标签或其他任何可以让您找到它的名称,它都将受到保护。
提示提交“后面”的所有提交也是如此:如果可以通过某些名称访问它们,则可以保护它们免受Grim Collector的侵害。 因此,名称确实具有双重目的,但是一旦合并分支提示,就不再需要“保护提交”目的。 (当然,如果添加新的提交,则会移动分支tip ,并且恢复其双重用途。)
还要注意, 远程跟踪分支名称(例如origin/master
工作方式完全相同,除了在添加新的提交时移动而不是在git fetch
从相应的远程git fetch
新的提交时移动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.