我见过的大多数 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 中的分支实际上就是分支。如果 feature
从 master
分支出来,而 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]
因为 master
是 feature
的直接祖先,所以不需要 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 。
关于git - merge 到 master 时为什么要删除功能分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29316225/