分支与手术

Git flow

git-flow 分支模型由五条规则和一大堆记账工作组成。规则很简单;人们在发布日傍晚六点搞砸的,是那些记账——把一个热修复合进了 main 却忘了 develop,或者给错误的分支打了标签。

⌘K → Git flow 帮你记这笔账。

发布分支上的 git flow 对话框:上方开始一个分支,下方结束它

这套布局

分支 承载
已发布分支(main) 生产环境里跑的东西。每次发布都在这里打标签。
集成分支(develop) 两次发布之间已完成工作的汇聚处。
feature/* 一个工作单元,从 develop 开出。
release/* 正在稳定中的某个版本,从 develop 开出。
hotfix/* 一个紧急修复,从 main 开出——生产环境等不了 develop。

Gitcito 读写的是 git flow 命令行工具所用的同一批 gitflow.* git 配置键(gitflow.branch.master、gitflow.prefix.feature,……)。别人已经跑过 git flow init 的仓库会被立刻识别,而在这里配置好的仓库之后也能配合命令行工具使用。Gitcito 全程只运行普通的 git 命令——不需要安装那个命令行工具。

设置会写入那些键,并且在集成分支尚不存在时,从已发布分支创建它。除此之外什么都不动。任何名字或前缀之后都可以在编辑布局里改。

开始

选一种类型,输入一个名字,按开始。在你真正落定之前,对话框会显示它即将创建的分支,以及它将从哪个分支创建:

feature/search   from develop
hotfix/1.0.1     from main

名字是你输入的;前缀来自布局。

结束

结束才是值得自动化的那一部分,因为它是好几个必须全部发生的步骤:

类型 Gitcito 做的事
特性 用 --no-ff 合并进 develop,删除该分支,把你留在 develop 上
发布 合并进 main,打标签,合并进 develop,删除该分支,把你留在 develop 上
热修复 合并进 main,打标签,合并进 develop,删除该分支,把你留在 main 上

--no-ff 是刻意的:正是那个合并提交让这个分支在事后仍能在图里看得见。没有它,一个短命的特性分支会消失成一条直线,这个模型也就失去了它存在的意义。

标签是 <版本标签前缀><名字>——用默认前缀时,release/1.1.0 会变成 v1.1.0。取消勾选给发布打标签可以跳过它;如果你想要的不只是默认内容,可以写一条标签信息。

它拒绝做的事

  • 工作区不干净就会中止。 先提交或贮藏;结束操作会合并两个分支并两次移动 HEAD,围着未提交的工作做这件事,正是人们把它弄丢的方式。
  • 合并发生冲突会把整件事回滚。 如果合并进 main 成功了,但合并进 develop 冲突了,你本来会剩下一个做了一半的发布。Gitcito 会把每个分支恢复到原来的位置,并报告这个冲突。手动合并那个分支,在冲突解决器里解决它,剩下的流程就由你自己手动完成。
  • 它从不推送。 结束是本地的。等你准备好了,再推送 main、develop 和那个新标签——见同步。

撤销

一次撤销就能把一切放回去:两个分支都回到它们之前的提交,标签被删除,被结束掉的分支在它原来的顶端重新创建。这正是「结束」值得放心一试的全部理由。

什么时候不该用它

git flow 适合有版本化发布、并且维护着一个受支持的生产分支的软件。如果你一天从 main 部署好几次,那么发布分支和热修复分支就是你不会用到的仪式感——堆叠分支或者从 main 开出的普通短命分支更合适。这个模型里关于特性分支的那一半,单独用起来仍然很好。

在 GitHub 上改进这份翻译