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

git remove old branches merge with --no-ff

我正在整理我的存储库,想删除一些不再使用的旧分支。 plenty info 关于如何删除它们。但是,我不确定这些解决方案对我来说是否安全,因为我使用 --no-ff.

合并了分支

假设我的日志是这样的:

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

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

基本上我希望 git branch returns 只有 *master 日志图仍然像上面那样(即没有重写提交feature_a_bmaster)。

您需要做的就是删除多余的分支名称(例如git branch -d feature_a feature_b)。提交本身是安全的,受分支名称 master 保护。链接问题的公认答案是自动执行此操作的一种方法。


我认为,以不同的方式绘制分支是有帮助的,因为 Git 的工作方式不同(与大多数其他版本控制系统以及您的想法不同)。而不是:

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

像这样画它们:

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

这样做的原因是 Git 的工作方式names 实际上直接指向特定的提交. Git 将这三个指向的提交称为三个分支的 tip 提交。提交本身——全部;图表中的所有 * 都是独立存在的;但它们 是以其中一个名字开头的。该名称定位到 tip 提交,然后 Git 从那里向后(向左)工作以找到分支上的其余提交。

合并提交——我在这张图中用字母 Mm 标记了两个——具有向后指向 two 的特性同时提交。当 Git 向后提交时,它必须遵循所有路径 "simultaneously" (或尽可能接近)。这意味着底行提交不仅在分支 feature_b 上,而且 在分支 master 上。中间行中的两个提交在 所有三个 分支上。

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

提示提交的所有提交 "behind" 也是如此:如果它们 可访问 来自某个名称,它们将受到 Grim 收集器的保护。所以名称确实有双重用途,但是一旦合并分支提示,就不再需要 "protect the commits" 用途。 (当然,如果你添加 new 提交,那 移动分支提示 ,它的双重用途恢复。)

还请注意,远程跟踪分支 名称如 origin/master 的工作方式完全相同,除了在添加新提交时不移动,它们在添加新提交时移动您 git fetch 来自相应远程的新提交。