git - merge 到 master 时为什么要删除功能分支

标签 git git-flow

我见过的大多数 git 工作流程都建议在 branch merge 到 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

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

最佳答案

需要认识到的重要一点是,Git 分支只不过是指向提交的标签。 Git 中的分支实际上就是分支。如果 featuremaster 分支出来,而 master 是提交 B,则存储库如下所示。

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 有父级 H 和 I。没有他们 J 就无法存在,它融入了 Git 的工作方式。没有 G,我就无法存在。没有 E,G 就无法存在。等等。分支必须保留

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

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]

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

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

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

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

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

如果您使用的是 Mac,GitX将为您可视化存储库。 gitk是通用版本。

关于git - merge 到 master 时为什么要删除功能分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29316225/

相关文章:

git - 使用 GitFlow 进行 VSTS 发布定义

git 工作流 + 预生产

git - 通过 pull 请求 merge 后如何删除本地分支? git-flow、bitbucket、sourcetree

git - 生成文件错误 : Unexpected end of line seen

git - 运行 git commit 时与编辑器相关的错误?

git - git-flow 是否应该在 master 上看到比开发更压缩的历史记录?

gitkraken 不会自动删除远程功能分支

git - 以编程方式获取 git 将使用 `git checkout -` 跳转到的修订版

git - 我应该将部署 key 与 Composer 一起使用吗?

Git 钩子(Hook),接收后循环通过提交