我正在管理我的仓库并希望删除一些不再使用的旧分支。关于如何删除它们有plenty info。但是,我不确定这些解决方案对我来说是否安全,因为我使用--no-ff
合并了分支。
想象一下,我的日志如下所示:
master *--*--*--------*--*--*--*
\ / /
\ / |
feature_a *--*--* |
\ |
\ /
feature_b *--*--*
问题:如何在不丢失数据和日志结构的情况下删除feature_a
和feature_b
分支?
基本上我希望git branch
仅返回*master
,和,日志图仍然如上所示(即没有重写feature_a
和{{的提交1}}到_b
)。
答案 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从那里向后(向左)工作以找到分支上的其余提交。
合并提交 - 我在此图表中标记了两个字母M
和m
- 具有向后指向两个提交的功能。当Git向后提交时,它必须“同时”跟踪所有路径(或尽可能接近)。这意味着底行提交不仅在分支feature_b
上,而且在分支master
上也是。其中两个中间行提交位于所有三个分支上。
当您删除分支名称时,它指向的提交 - 其提示将丢失其名称。如果这是唯一的名称,您可以通过该名称找到该提交,它也会失去对Git的垃圾收集器(git gc
:GC的提交死神的保护=垃圾收集器,或者我喜欢称之为Grim Collector :-))。但如果它有一些其他分支名称,甚至标签或其他任何可以让你找到它的名称,它仍然受到保护。
提示提交的“后面”提交也是如此:如果它们从某个名称可到达,它们将受到Grim Collector的保护。因此名称确实有双重目的,但是一旦合并了分支提示,就不再需要“保护提交”的目的。 (当然,如果您添加 new 提交,会移动分支提示,并且其双重目的会恢复。)
请注意,origin/master
之类的远程跟踪分支名称的工作方式完全相同,只是当您添加新提交时,它们不会移动,而是在{{1}时移动来自相应远程的新提交。