git flow实践
什么是git flow
git-flow是最早诞生、并得到广泛采用的一种工作流程,主要特点如下:
- 存在两个长期分支
- 主分支(master)
- 开发分支 (develop)
- 存在三种短期分支
- 功能分支(feature branch)
- 补丁分支(hotfix branch)
- 预发分支(release branch)
安装git flow
安装依赖包(mac)
brew install git-flow
配置zsh(增加自动补全命令)
open ~/.zshrc
plugins=(git git-flow git-flow-completion python svn xcode ruby perl)
git flow 分支简介
分支 | 描述 |
---|---|
master/production | 分支生产环境代码,线上稳定版本,只能从其他分支合并,不能提交修改,必须打tag |
develop | 分支主要开发分支,在此分支派生出feature或bugfix分支 |
feature/bugfix | 分支基于dev分支创建,开发独立的功能或模块,完成后合并到dev分支 |
release | 基于dev分支创建,用于测试和bug修复 |
hotfix | hotfix分支基于Master分支创建,紧急修复线上的bug,开发完后需合并到master和develop分支,同时在master上打一个tag |
git flow 工作流总览
git flow 实践指令
git flow 初始化
git flow init
功能开发feature
- 创建功能
git flow feature start feature-name
- 完成功能
git flow feature finish feature-name
1 | 这个命令会把我们的修改整合到develop分支中去,之后,git-flow会进行清理操作,它会删除当前已完成的功能分支,并且切换到develop分支。 |
release管理(基于develop分支)
- 判定develop分支是否为一个成熟的release版本的条件:
- 已完成所有新功能和必要的修复
- 已经被彻底测试过了
- 创建release:release分支使用版本号命名
git flow release start 1.1.1
- 完成release
git flow release finish 1.1.1
1 | 之后git-flow会拉取远程仓库,保证当前是最新的,然后release会被分别合并到master和develop,最后分支清除,回master。 |
hotfix(基于master分支)
- 创建hotfix
git flow hotfix start missing-something
- 完成hotfix
git flow hotfix finish missing-something
1 | 这个过程类似发布release,完成后改动会被同时合并入master和develop,然后hotfix分支会被删除,然后重新切换回develop分支。 |
git flow 源码泛读
好像是php写的,php不会,但是加上注释勉强能理解。如果说错了,望指正。源码地址:gitflow
Init
git flow init
- 初始化配置,并将配置写入配置文件
- 按项目情况创建分支(判断项目是否存在master分支和develop分支,不存在则创建)
Feature
git flow start feature feature-1
- 更新当前分支(git fetch)
- 新建feature分支并切换到该分支(git checkout -b)
git flow finish feature feature-1
- 更新当前分支和develop分支(git fetch)
- 切换到develop分支(git checkout develop)
- 合并分支(git merge feature)
- 删除分支(git branch -d)
Release
git flow release start 1.1.1
- 更新develop分支(git fetch develop)
- 新建release分支并切换到该分支
git flow release finish 1.1.1(最后停留在master分支)
- 更新master分支与develop分支
- 分别checkout develop和master,并合并release分支
- 切换到master分支
- 删除release分支
- 更新远程分支
hotfix
git flow hotfix start hotfix-1
- 更新master(git fetch)
- 从master新建分支并切换到该分支(git checkout -b hotfix-1)
git flow hotfix finish hotfix-1(最后停留在develop分支)
- 更新develop分支和master分支(git fetch)
- 分别checkout master和develop
- 分别合并hotfix分支
- 删除hotfix并推送更新远程master与develop
总结
这个其实是我实习前2个月写的,一开始组内打算推广使用gitflow工作流,然后让我去做下技术调研。最终的结果是,我们只用上了gitflow的思想。
gitflow的本质是对git命令的多层封装,通过使用组装的git命令,从而达到规范开发流程的目的。后面我们组内约定成俗,不管是修复bug,需求,还是优化,自觉在分支前加上 bugfix/feature/improve前缀,发布后删除分支,按gitflow的流程开发。
然后还想起很久之前的一个面试题:假设你现在开发某个需求,临时要修复bug怎么办,之前只说了思路,不会写,emmm也总结一下,虽然是个简单的东西:
1 | git stash //暂存修改 |
关于合并时出现rebase:
1 | //出现这种情况一般是本地develop代码不是最新的,合并上远程会导致冲突 |
Reference
1、learn version control with git
2、Git工作流程
3、 Git-flow备忘清单
4、gitflow