使用可扩展的git flow建立团队项目工作流

git flow 是什么

Git flow是一种基于git分支模型的工作流程,旨在简化软件开发过程中的合并和发布管理。主要包括以下分支。

分支 功能
master 生产环境的稳定版本
develop 开发分支
feature 功能分支
release 预发布分支
hotfix 紧急修复生产环境的bug
bugfix 修复开发环境的bug

举一个简单的使用案例。

git flow feature start xxx会从develop分支创建一个feature/xxx分支。在新分支上完成功能开发之后使用git flow feature finish xxx令新分支合并到develop分支并删除新分支。这就是一个完整的功能开发流程。

git flow 有什么问题

  • 分支类型固定

只能创建以上几种类型的分支,不一定满足某些开发团队的需求。

  • 没有固定的配置,无法形成团队规范

使用git flow之前需要使用git flow init来初始化。在这个过程中,可以设置master和develop的名字以及其他几种类型分支的前缀。但这些信息都会被保存在.git目录下。也就是说只能在本地作用,无法与团队分享,一旦重新拉取远程仓库,就需要重新初始化。

可扩展的git flow

git-flow-rs是一款遵循配置的,可扩展的git flow替代品。

可以通过cargo install git-flow-rs安装,也可以下载release

以下是可用的命令。

xml 复制代码
Extensible git flow written in rust.

Usage: git flow <command>

Avaliable commands:

-h, --help
	Print help
-v, --version
	Print version
start (<branch_type> <branch_name>)/(<full_branch_name>)
	start a task
finish (<branch_type> <branch_name>)/(<full_branch_name>)
	finish a task
drop (<branch_type> <branch_name>)/(<full_branch_name>)
	give up a task
track (<branch_type> <branch_name>)/(<full_branch_name>)
	track a task
sync remote/local [--override]
	sync branches to remote/local

Configured branch types:

feature
	from dev to dev
  • start: 启动一个任务
  • finish: 完成一个任务
  • drop: 放弃一个任务
  • track: 追踪一个任务
  • sync: 将所有分支同步到远程/本地,加上--override意味着会删除多余的分支

使用之前需要先进行配置,以下是一个案例。

  • 全局配置文件应放在~/.config/git-flow/.git-flow.jsonC:\Users\YourUsername\AppData\Roaming\git-flow\.git-flow.json
  • 项目配置文件应放在<GitRoot>/.git-flow.json
json 复制代码
[
  {
    "type": "feature",
    "name": "feature/{new_branch}",
    "from": "dev",
    "to": [
      {
        "branch": "dev",
        "strategy": "merge"
      }
    ],
    "hooks": {
      "after_start": {
        "command": "git",
        "args": ["push", "origin", "feature/{new_branch}:feature/{new_branch}"]
      },
      "after_finish": {
        "command": "git",
        "args": ["push", "origin", "--delete", "feature/{new_branch}"]
      }
    }
  },
  {
    "type": "hotfix",
    "name": "hotfix/{new_branch}",
    "from": "main",
    "to": [
      {
        "branch": "main",
        "strategy": "merge"
      },
      {
        "branch": "dev",
        "strategy": "merge"
      },
      {
        "branch": "feature/*",
        "strategy": "merge"
      }
    ]
  },
  {
    "type": "bugfix",
    "name": "bugfix/{new_branch}",
    "from": "dev",
    "to": [
      {
        "branch": "dev",
        "strategy": "merge"
      },
      {
        "branch": "feature/*",
        "strategy": "merge"
      }
    ]
  },
  {
    "type": "release",
    "name": "release/{new_branch}",
    "from": "dev",
    "to": [
      {
        "branch": "main",
        "strategy": "merge"
      }
    ]
  }
]
  • type表示分支类型
  • name定义了分支名,创建新分支时{new_branch}将被替换。
  • from指定来源分支。
  • to指定目标分支,其中strategy表示合并策略,可选mergerebasecherry-pick,branch上可用正则表达式。
  • hooks可选before_startafter_startbefore_finishafter_finish

举一个简单的案例。使用git flow start hotfix xxx(也可以是git flow start hotfix/xxx),从main分支上创建hotfix/xxx,修复bug后使用git flow finish hotfix xxx,该分支会被合并到maindev以及所有的功能分支上,然后被删除。

与可视化工具集成

其他没用过,给个lazygit的配置。

less 复制代码
customCommands:
  - key: "I"
    description: "git flow finish"
    context: "localBranches"
    prompts:
      - type: "confirm"
        title: "git flow"
        body: "Are you sure to finish this branch?"
    command: "git-flow finish {{.SelectedLocalBranch.Name}}"
  - key: "i"
    description: "git flow start"
    context: "localBranches"
    prompts:
      - type: "menuFromCommand"
        title: "git flow branch type"
        key: "BranchType"
        command: "sh path_to_gitflow.sh"
        filter: '"(.*)"'
        valueFormat: "{{ .group_1 }}"
        labelFormat: "{{ .group_1 }}"
      - type: "input"
        title: "git flow branch name"
        key: "BranchName"
    command: "git-flow start {{.Form.BranchType}} {{.Form.BranchName}}"

注意把path_to_gitflow.sh换一下。

gitflow.sh内容如下。

sh 复制代码
[ -f .git-flow.json ] && cat .git-flow.json | jq '.[].type' || cat ~/.config/git-flow/.git-flow.json | jq '.[].type'

优势

  • 遵循配置,便于统一团队规范。
  • 可扩展,便于自定义工作流。
  • 灵活。新分支取名更灵活,可开发更多功能,如通过分支名进行多级分类。目标分支名可设置为正则表达式,提供了批处理的能力。
  • 支持自定义hooks,一定程度上提供了与远程仓库交互的能力。如启动任务时将新建分支推送到远程。

其他

这东西只是灵感乍现写着玩玩,虽然我自己用着没什么问题,但仍不是一个成熟的产品。如果觉得有意思或者有帮助可以试用。有什么bug或者需求欢迎提issue。

相关推荐
但老师7 小时前
Git遇到“fatal: bad object refs/heads/master - 副本”问题的解决办法
git
秃头女孩y7 小时前
git创建分支
git
研究是为了理解12 小时前
Git Bash 常用命令
git·elasticsearch·bash
DKPT12 小时前
Git 的基本概念和使用方式
git
Winston Wood16 小时前
一文了解git TAG
git·版本控制
喵喵先森16 小时前
Git 的基本概念和使用方式
git·源代码管理
xianwu54317 小时前
反向代理模块
linux·开发语言·网络·git
binishuaio20 小时前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
会发光的猪。20 小时前
如何在vscode中安装git详细新手教程
前端·ide·git·vscode
stewie61 天前
在IDEA中使用Git
java·git