github flow实践
git flow的问题
git flow是一个较早的版本管理模型,但是也有一些实际在使用上的问题。第一个常见的问题就是因为git flow的模型设计是围绕着release进行的,所以master成为了一个
用于保存向生产环境发布代码的分支,而真正的主分支我们使用的是develop分支而不是master分支,但是无论是交流上还是一些工具的缺省设定,一般都会直接使用master,
这跟我们通常的说法不同,所以每次都需要解释:这种分支模型的develop分支就是经常意义上的master主分支。
而另外一个问题则是git flow模型还是较为复杂,对于缺乏版本管理知识的普通开发者来说,学习曲线和使用成本较高。
随着持续集成和持续部署在很多项目中的推动,项目越来越多进行持续的发布,而像传统的开发方式那样,同时多功能合并在一个大版本中一起发布的情形越来越少,
取而代之的则是小步快跑,持续集成结合继续部署,使得传统模式下复杂分支管理的需求变得越来越少,很多时候只需要一个master分支即可,而正是这种情况则是github flow提出的原因。
github flow产生的契机
正如Scott Chacon在他的文章中提到的那样:既然已经有git flow了,为什么github不是直接用git flow就好了呢?这个模型过于复杂,项目实际需要的似乎比其简单的多。
于是在这个基础之上,在github,他们没有使用git flow,而是使用了一个更加简单的git工作流程,这个简化的模型就是github flow。
而且更为重要的原因,围绕着release设计的fit flow模型对github来说缺乏吸引力的重要原因是release对github来说从来都不是问题而也也没有成为问题过,每天github都可以release多次,
他们甚至可以通过hobot机器人自动做到这些,整个部署的流程对每个开发者来说都不是什么问题,持续集成的基础已经非常的好,所以在这个基础之上,会理所当然地认为更为简单的模型就能够解决这个问题。
git flow的主要特点
长期分支
github flow只有一条master长期分支用于管理随时可以进行发布的分支,在master分支上的一切都被认为是可以随时可以进行部署到生产环境的内容。
临时分支
github flow不同于git flow存在release/hotfix/feature三类分支,github flow只有一种分支就是特性分支。无论是bug修正还是特性开发在github flow中都是特性分支。
Pull Request
github的Pull Request分支提供了一种review和合并的机制,在gitflow中,这种机制也被使用地淋漓尽致。github flow使用Pull Request用于取得feedback以及合并。
github flow使用方式
github flow在使用时主要遵循如下方式:
第一:只有可以部署的内容才会放到master分支上,所以master分支上的任何内容都是可部署的。
第二:特性分支的创建需要以master为基础,同时特性分支的命名需要意义清晰,容易理解。
第三:特性分支需要经常更新到远程仓库中,远程仓库中的特性分支应与本地特性分支名称相同。
第四:当需要反馈或者帮助的时候,或者当分支已经可以进行合并的时候,随时可以开启一个pull request。
第五:仅当pull request通过review之后才进行合并。
第六:一旦合并之后并推送到master分支,则意味着此内容已经随时可以进行部署,根据持续集成的原则,可以也应当立即进行部署。
github flow的模拟使用
接下来我们使用gitlab10.4.2以及git1.8.3.1来模拟一下github flow开发的流程。
创建一个项目
首先我们使用gitlab的restapi创建一个项目,当然也可以直接在gitlab上进行图形界面操作,具体命令如下,请根据自己的gitlab的URL和token进行修改, 另外jq命令如果没有可以不使用,对结果不产生影响,仅仅对结果的显示格式进行整形而已
执行命令
curl –request POST –header “PRIVATE-TOKEN: sqiSUhn3tHYXe8nSGRDi” –data “name=githubflowmodel” “http://127.0.0.1:32001/api/v4/projects” |jq .
执行log
[root@devops ~]# curl --request POST --header "PRIVATE-TOKEN: sqiSUhn3tHYXe8nSGRDi" --data "name=githubflowmodel" "http://127.0.0.1:32001/api/v4/projects" |jq .
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1931 100 1911 100 20 1139 11 0:00:01 0:00:01 --:--:-- 1140
{
"id": 3,
"description": null,
"name": "githubflowmodel",
"name_with_namespace": "Administrator / githubflowmodel",
"path": "githubflowmodel",
"path_with_namespace": "root/githubflowmodel",
"created_at": "2018-02-04T19:15:18.826Z",
"default_branch": null,
"tag_list": [],
"ssh_url_to_repo": "git@3ff5a6afdc80:root/githubflowmodel.git",
"http_url_to_repo": "http://3ff5a6afdc80/root/githubflowmodel.git",
"web_url": "http://3ff5a6afdc80/root/githubflowmodel",
"avatar_url": null,
"star_count": 0,
"forks_count": 0,
"last_activity_at": "2018-02-04T19:15:18.826Z",
"_links": {
"self": "http://3ff5a6afdc80/api/v4/projects/3",
"issues": "http://3ff5a6afdc80/api/v4/projects/3/issues",
"merge_requests": "http://3ff5a6afdc80/api/v4/projects/3/merge_requests",
"repo_branches": "http://3ff5a6afdc80/api/v4/projects/3/repository/branches",
"labels": "http://3ff5a6afdc80/api/v4/projects/3/labels",
"events":