GitFlow工作流

GitFlow 是一种 Git 工作流,这个工作流程围绕着project的发布(release)定义了一个严格的如何建立分支的模型。它是团队成员遵守的一种代码管理方案 。

Git建分支是非常cheap的,我们可以任意建立分支,对任意分支再分支,分支开发完后再合并。

比较推荐、多见的做法是特性驱动(Feature Driven)的建立分支法(Feature Branch Workflow)。

简而言之,就是每一个特性(feature)的开发并不直接在主干上开发,而是在分支上开发,分支开发完毕后再合并到主干上。

这样做的好处是:

还处于半成品状态的feature不会影响到主干

各个开发人员之间做自己的分支,互不干扰

主干永远处于可编译、可运行的状态

GitFlow则在这个基础上更进一步,规定了如何建立、合并分支,如何发布,如何维护历史版本等工作流程。

分支名称 分支说明

Production 生产分支,即 Master分支。只能从其他分支合并,不能直接修改

Release 发布分支,基于 Develop 分支创建,待发布完成后合并到 Develop 和 Production 分支去

Develop 主开发分支,包含所有要发布到下一个 Release 的代码,该分支主要合并其他分支内容

Feature 新功能分支,基于 Develop 分支创建,开发新功能,待开发完毕合并至 Develop 分支

Hotfix 修复分支,基于 Production 分支创建,待修复完成后合并到 Develop 和 Production 分支 去,同时在 Master 上打一个tag

GitFlow 工作流程

一、Git Flow 最常用的「语句」

Git Flow 本质上是「分支模型 + 一套约定俗成的命令」。

最早是 Vincent Driessen 的 A successful Git branching model,后来社区做了一个封装脚本 git-flow (AVH Edition)。以下命令假设你已经装好扩展,命令以 git flow ... 开头;如果你不用扩展,用纯 Git 命令也能做,只是得自己记流程。

1. 初始化仓库(只做一次)

bash

复制

复制代码
git flow init           # 交互式问你要用哪些分支名
git flow init -d        # -d = --defaults,全部用默认值(master/develop)

初始化后会在 .git/config 里写几个变量,告诉脚本主分支、开发分支、前缀叫什么。

2. 开始一个功能(feature)

bash

复制

复制代码
git flow feature start login-page      # 创建并切到 feature/login-page
# 相当于:
#   git checkout -b feature/login-page develop

开发完以后:

bash

复制

复制代码
git flow feature finish login-page     # 把分支合并回 develop,然后删除
# 相当于:
#   git checkout develop
#   git merge --no-ff feature/login-page
#   git branch -d feature/login-page

多人协作:

bash

复制

复制代码
git flow feature publish login-page    # 把本地分支推到远程同名分支
git flow feature pull origin login-page

3. 准备发布(release)

bash

复制

复制代码
git flow release start 1.3.0          # 基于 develop 创建 release/1.3.0
# 修 bug、改版本号......
git flow release finish 1.3.0         # 合并到 master 和 develop,打 tag

finish 时会:

  1. 把 release/1.3.0 合并到 master
  2. 在 master 打 tag v1.3.0
  3. 再把 release/1.3.0 合并回 develop
  4. 删除 release/1.3.0 分支

4. 紧急热修复(hotfix)

bash

复制

复制代码
git flow hotfix start 1.2.1           # 基于 master(线上代码)
# 修完:
git flow hotfix finish 1.2.1          # 合并到 master 和 develop,打 tag

5. 支持版本(support)------很少用

bash

复制

复制代码
git flow support start 1.2.x master   # 给老版本建长期维护分支

二、-u 这一类「符号」到底是什么意思

Git 的命令行接口跟 Unix 世界大多数工具一样,用 flag/option 来改变默认行为。

写法分两种:

  • 短选项 :一个横线 - 后面跟一个字母,可以连写,如 -u-am(等价于 -a -m)。
  • 长选项 :两个横线 -- 后面跟一个单词,如 --set-upstream--all

最常见的 -u 场景:git push -u origin feature

bash

复制

复制代码
git push -u origin feature/login-page

这里的 -u--set-upstream 的简写,作用:

把本地分支 feature/login-page 与远程分支 origin/feature/login-page 建立「追踪关系」(upstream)。

以后你只需要敲 git push / git pull,Git 就知道跟哪个远程分支同步。

建立追踪后,.git/config 里会出现:

复制

复制代码
[branch "feature/login-page"]
    remote = origin
    merge = refs/heads/feature/login-page

其他高频符号/flag 举例

表格

复制

|----------------------------------------|-----------|--------------------|------------------------|
| 命令 | 符号 | 全称/含义 | 一句话解释 |
| git commit -a | -a | --all | 把已跟踪文件的修改全部自动加到暂存区然后提交 |
| git commit -m "msg" | -m | --message | 直接在命令行写提交信息 |
| git checkout -b xxx | -b | --branch | 创建并立即切换到新分支 |
| git branch -d xxx | -d | --delete | 删除已合并的分支(安全) |
| git branch -D xxx | -D | --delete --force | 强制删除分支 |
| git push -f | -f | --force | 强制推送,覆盖远程历史 |
| git merge --no-ff xxx | --no-ff | 禁用 fast-forward | 保留分支拓扑,方便看历史 |
| git log --oneline --graph --decorate | 多个长选项 | 一行显示、图形、分支/标签标记 | 最美 log 三连 |


小结

  • Git Flow 的核心命令就 5 组:init / feature / release / hotfix / support,背后都是「在某个分支上创建、合并、删除」的普通 Git 操作。
  • -u, -m, -b, -d, -f 之类只是「选项缩写」,用 man git-<子命令>git <子命令> -h 就能查到全称和作用。记住:一个横线是短选项,可以合并写;两个横线是长选项,好读但打字多。