合并到 master 时为什么要删除功能分支

why should I delete feature branches when merged to master

我见过的大多数 git 工作流程都建议在 branch 合并到 master 后删除它。例如,此 gitflow 建议如下:

# 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

为什么要删除分支?我也很好奇后来发现该功能引入的错误时该怎么办 - 我是否应该再次创建具有相同名称的分支,在那里修复错误,合并到 master 并再次删除分支?

因为 myfeature 分支历史代表了为实现 myfeature.

而完成的所有中间提交

该策略只在 master 中保留一次提交,而忽略了中间步骤,这对长期存在的分支很有意义,正如我在“Why does git fast-forward merges by default?”中解释的那样。

master 中完成(合并)的一个提交的提交消息应该清楚地表明它已完成以实现“myfeature”。

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

需要认识到的重要一点是 Git 分支只不过是指向提交的标签。 Git 中的分支实际上是分支。如果 featuremaster 是提交 B.

时从 master 分支出来,这就是存储库的样子
A - B - C - F - H [master]
     \
      D - E - G - I[feature]

看到了吗?实际分支。当你 git merge feature 成为 master 时,你会得到这个。

A - B - C - F - H - J [master]
     \             /
      D - E - G - I  [feature]

一旦你 git branch -d feature 分支历史就会保留!

A - B - C - F - H - J [master]
     \             /
      D - E - G - I

J 有 parents H 和 I。没有它们 J 就不可能存在,它融入了 Git 的工作原理。没有 G,我就无法存在。没有 E,G 就无法存在。等等。分支必须保留

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

git merge --no-ff 用于防止 Git 执行 "fast forward" 并丢失分支历史记录。如果自创建分支以来未在 master 上完成任何工作,就会发生这种情况。 fast-forward 看起来像这样。

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

git checkout master
git merge feature

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

由于 masterfeature 的直接祖先,因此不需要合并。 Git 可以只移动 master 标签。你的分支历史丢失了,看起来 D、E、G 和 I 都是在 master 上作为单独的提交完成的。 git merge --no-ff 告诉 Git 永远不要这样做,总是执行合并。

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

既然如此,为什么要删除分支?两个原因。首先,它会用死分支弄乱你的分支列表。

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

不幸的是,git log 对用户说谎并呈现非线性历史的线性表示。要解决此问题,请使用 git log --graph --decorate。这将像我上面的示例一样画线,并向您显示每次提交的任何分支和标签。您将对存储库有更真实的了解。

如果您使用的是 Mac,GitX will visualize the repository for you. gitk 是通用版本。