Git 合并到主功能时,为什么要删除要素分支

Git 合并到主功能时,为什么要删除要素分支,git,git-flow,Git,Git Flow,我看到的大多数git工作流都建议在将分支合并到master之后删除它。例如,这表明: # Incorporating a finished feature on develop $ git checkout develop Switched to branch 'develop' $ git merge --no-ff myfeature Updating ea1b82a..05e9557 (Summary of changes) $ git branch -d myfeature Delet

我看到的大多数git工作流都建议在将分支合并到master之后删除它。例如,这表明:

# Incorporating a finished feature on develop 
$ git checkout develop
Switched to branch 'develop'
$ git merge --no-ff myfeature
Updating ea1b82a..05e9557
(Summary of changes)
$ git branch -d myfeature
Deleted branch myfeature (was 05e9557).
$ git push origin develop

我为什么要删除分支?我也很好奇,当后来发现该功能引入了一个bug时,该怎么办——我是否应该再次创建同名的分支,在那里修复bug,合并到master并再次删除分支?

,因为
myfeature
分支历史记录表示为实现
myfeature
而完成的所有中间提交

此策略只在
master
中保留一个提交,而忽略中间步骤,这对于长寿命分支是有意义的,如我在“”中所解释的

master
中一个commit done(merged)的commit消息应该清楚地表明它是为了实现“
myfeature
”而完成的


如果需要修复,则可以重用分支名称(因为它以前被删除过)。

重要的是,Git分支只不过是指向提交的标签。Git中的分支实际上就是分支。以下是当
master
是提交B时,如果
feature
分支出
master
,存储库的样子

A - B - C - F - H [master]
     \
      D - E - G - I[feature]
看到了吗?实际分支。当您将git合并特性
into master时,您会得到这个

A - B - C - F - H - J [master]
     \             /
      D - E - G - I  [feature]
一旦您
git branch-d功能
分支历史仍然存在

A - B - C - F - H - J [master]
     \             /
      D - E - G - I
J有父母H和I。没有他们,J就无法生存,Git的工作方式就是这样。我不能没有G而生存。G不能没有E而生存,等等。分支机构必须保留

J是一个合并提交,它通常包含被合并的分支的名称。它与任何其他提交一样,因此您甚至可以向其添加更多信息,例如返回到问题跟踪器的链接

git merge--no ff
用于防止git执行“快进”操作并丢失分支历史记录。如果自分支创建以来,
master
上未执行任何工作,则会发生这种情况。快进看起来像这样

A - B[master]- D - E - G - I [feature]

git checkout master
git merge feature

A - B - D - E - G - I [feature] [master]
由于
master
功能的直接祖先,因此不需要合并。Git只需移动
master
标签即可。您的分支历史记录丢失,看起来D、E、G和我都是作为单个提交到master上完成的
git merge——no ff
告诉git永远不要这样做,总是执行合并

将来,当它注意到G中引入了一个bug时,任何浏览存储库的人都可以看到它是作为分支的一部分完成的,可以提前查找合并提交,并从中获取有关分支的信息

即便如此,为什么要删除分支?有两个原因。首先,它会把你的分支列表中的死分支弄得乱七八糟

第二,也是更重要的一点,它阻止您重用分支。分支和合并是复杂的。一次性使用、寿命短的功能分支通过确保只将分支合并回主分支一次,简化了流程。这消除了许多技术和管理问题。合并分支时,即完成合并。如果您需要修复该分支中引入的问题,只需将其视为master中的bug,并创建一个新分支来修复它

不幸的是,
git log
对用户来说是一个谎言,它提供了一个非线性的历史的线性表示。要解决此问题,请使用git log--graph--decoration
。这将像我上面的示例中那样画线,并显示每个提交上的任何分支和标记。您将更真实地了解存储库


如果您在Mac上,将为您可视化存储库。是通用版本。

因为您的功能已完成。有什么必要保留该分支,从而使git分支的结果变得混乱-等等?@OliverCharlesworthhistory@Z.Khullah-提交仍然会在历史上。是的,我的意思是这就是人们问这个问题的原因,因为他们不知道删除代码从来都不是一个好主意(除非它完全是垃圾/完全是一团糟)。假设功能非常复杂,尝试了3种不同的解决方案/代码路径。第一个似乎是最好的,但后来发现应该使用解决方案2。取决于解决方案2是否是解决方案1的子分支,它现在可能会消失,从而丢失解决方案2和3上的工作。还可以在模块中开发功能。把它看作一个分支而不是一个新的模块,这有点奇怪。该模块可以与代码库分开完成。谢谢。你说的短命分支是什么意思?功能分支有什么不同吗?另外,据我所知,当功能分支合并到master中时,有关分支的信息应该存储在合并提交中?您还可以看一下我留下的评论,以获得您的答案吗?@Maximus演示了一个快照实时分支(仅在master中快速合并了几个提交),而不是一个长寿命分支,在最终合并到master之前,将完成多个提交(包括尝试和错误):在后一种情况下,在master中只保留一个提交会更干净。明白了,谢谢!我在某个地方读到过,直接提交到master不是一个好主意,但对于快速转发的短命分支,似乎正是这样。所以据我所知,这不是一个坏习惯,对吧?最近在一些git相关论坛上偶然发现了你6年前关于git约会的基本问题。。。很难想象你曾经对git的使用不如我:)谢谢你的回答!在解释git分支是什么之前,请移动以为什么删除分支开始的部分,以便寻找相同答案的人在顶部得到正确的响应:)
VonC
的答案也很有帮助,也许你可以将他的部分答案加入到你的答案中,使之成为一个完整的信息来源。感谢