git 删除旧分支与 --no-ff 合并
git remove old branches merge with --no-ff
我正在整理我的存储库,想删除一些不再使用的旧分支。 plenty info 关于如何删除它们。但是,我不确定这些解决方案对我来说是否安全,因为我使用 --no-ff
.
合并了分支
假设我的日志是这样的:
master *--*--*--------*--*--*--*
\ / /
\ / |
feature_a *--*--* |
\ |
\ /
feature_b *--*--*
问题:如何在不丢失数据和日志结构的情况下删除feature_a
和feature_b
分支?
基本上我希望 git branch
returns 只有 *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 的工作方式:names 实际上直接指向特定的提交. Git 将这三个指向的提交称为三个分支的 tip 提交。提交本身——全部;图表中的所有 *
都是独立存在的;但它们 是以其中一个名字开头的。该名称定位到 tip 提交,然后 Git 从那里向后(向左)工作以找到分支上的其余提交。
合并提交——我在这张图中用字母 M
和 m
标记了两个——具有向后指向 two 的特性同时提交。当 Git 向后提交时,它必须遵循所有路径 "simultaneously" (或尽可能接近)。这意味着底行提交不仅在分支 feature_b
上,而且 也 在分支 master
上。中间行中的两个提交在 所有三个 分支上。
当你删除一个分支名称时,它指向的提交——它的尖端——将失去它的名称。如果这是您可以找到该提交的 唯一 名称,它也会失去对提交死神、Git 的 垃圾收集器(git gc
:GC = 垃圾收集器,或者我喜欢称之为 Grim 收集器 :-))。但如果它有其他分支名称,甚至是标签或任何其他可以让您找到它的东西,它仍然受到保护。
提示提交的所有提交 "behind" 也是如此:如果它们 可访问 来自某个名称,它们将受到 Grim 收集器的保护。所以名称确实有双重用途,但是一旦合并分支提示,就不再需要 "protect the commits" 用途。 (当然,如果你添加 new 提交,那 移动分支提示 ,它的双重用途恢复。)
还请注意,远程跟踪分支 名称如 origin/master
的工作方式完全相同,除了在添加新提交时不移动,它们在添加新提交时移动您 git fetch
来自相应远程的新提交。
我正在整理我的存储库,想删除一些不再使用的旧分支。 plenty info 关于如何删除它们。但是,我不确定这些解决方案对我来说是否安全,因为我使用 --no-ff
.
假设我的日志是这样的:
master *--*--*--------*--*--*--*
\ / /
\ / |
feature_a *--*--* |
\ |
\ /
feature_b *--*--*
问题:如何在不丢失数据和日志结构的情况下删除feature_a
和feature_b
分支?
基本上我希望 git branch
returns 只有 *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 的工作方式:names 实际上直接指向特定的提交. Git 将这三个指向的提交称为三个分支的 tip 提交。提交本身——全部;图表中的所有 *
都是独立存在的;但它们 是以其中一个名字开头的。该名称定位到 tip 提交,然后 Git 从那里向后(向左)工作以找到分支上的其余提交。
合并提交——我在这张图中用字母 M
和 m
标记了两个——具有向后指向 two 的特性同时提交。当 Git 向后提交时,它必须遵循所有路径 "simultaneously" (或尽可能接近)。这意味着底行提交不仅在分支 feature_b
上,而且 也 在分支 master
上。中间行中的两个提交在 所有三个 分支上。
当你删除一个分支名称时,它指向的提交——它的尖端——将失去它的名称。如果这是您可以找到该提交的 唯一 名称,它也会失去对提交死神、Git 的 垃圾收集器(git gc
:GC = 垃圾收集器,或者我喜欢称之为 Grim 收集器 :-))。但如果它有其他分支名称,甚至是标签或任何其他可以让您找到它的东西,它仍然受到保护。
提示提交的所有提交 "behind" 也是如此:如果它们 可访问 来自某个名称,它们将受到 Grim 收集器的保护。所以名称确实有双重用途,但是一旦合并分支提示,就不再需要 "protect the commits" 用途。 (当然,如果你添加 new 提交,那 移动分支提示 ,它的双重用途恢复。)
还请注意,远程跟踪分支 名称如 origin/master
的工作方式完全相同,除了在添加新提交时不移动,它们在添加新提交时移动您 git fetch
来自相应远程的新提交。