Git的代码分支策略实践

目前主流的git工作流模式有git flow、github flow、gitlab flow这几种,采用不同的代码分支策略,意味着实施不同的代码集成与上线流程,这会影响整个研发团队每日的协作方式,因此研发团队通常需要认真的选择适合自己的分支策略。

对于Git flow的工作流程,可以参考下面这篇(我个人比较推崇阮老师的博客,里面干货很多)
Git工作流程-阮一峰的博客

这篇是gitlab的CEO Sytse Sijbrandij写的一篇关于gitlab flow的blog,里面其实三种策略都有写到,并总结了优缺点,官方推荐
GitLab Flow

这篇是上面那篇gitlab flow博客的中文翻译,翻的很不错,英文不好的可以直接看这篇
GitLab Flow的使用

代码管理策略主要有主干开发和功能分支开发这两种,功能分支开发又分为以下几种主流模型,几种模型各有所长,下面简述一下

  • git flow:出现时间最早,基于git的workflow的开山鼻祖,可以说给出了一个git flow的最佳实践,缺点是流程比较复杂,release branch和hotfix branch几乎没人使用,另外需要长期维护master和dev两个分支,在规模不大的场景下维护成本比较高
  • github flow:相当精简,只有master主干和feature branch这两种,结构相当清晰,缺点是master默认为当前上线的最新版本,在对于版本管理要求比较复杂的场景下灵活性不足
  • gitlab flow:出现的最晚,可以说集合了前两家的长处,既保证只有一个长期主干,结构清晰,同时也定义了不同场景下的branch,增强了灵活性。

像谷歌、脸书这样的互联网大咖,现在采用的都是主干开发模式,即只有一个master主干,所有的代码合并都在主干上完成,优点是结构清晰,特别适合快速的CI/CD流程,但是对于团队的技术能力要求非常高。目前国内的互联网公司,一般都采用功能分支(feature branch)的开发模式,在开发人员能力良莠不齐的情况下,相对来说对于代码的掌控能力比较好。
对于几种模式的使用场景,如下表所列:(列表来源:极客时间王潇俊的持续交付专题)

序号 情况 适合的分支策略
1 开发团队能力很强,需要快速的CI/CD能力 主干开发
2 有预定的发布周期,需要执行严格的发布流程 Git Flow
3 随时集成随时发布,分支merge后经过评审就可以自动发布 Github Flow
4 无法控制准确的发布时间,但又要求不停集成 Gitlab Flow(带生产分支)
5 需要逐个通过各个测试环境验证 Gitlab Flow(带环境分支)
6 需要对外发布和维护不同版本 Git Flow(带版本分支)

其实不管是选择哪种分支策略,都是基于Feature Driven Development(FDD)原则进行项目管理,既先要有issue(需求)输入,建立对应的功能分支(feature branch)再进行代码开发,完成之后合入主干,同时删除该功能分支。
个人认为对于中小型的团队来说,github flow已经足够完成需求,并且由于微服务架构的流行,一般工程都已经按照服务进行拆分,每个服务一个repo,需要同时进行复杂版本管理的场景不是很多。而现在一般在内网部署都是采取gitlab,所以下面就来说说怎么在gitlab里实施github flow(听起来有点绕口-__-)

  1. repo的maintainer在issue上创建问题(新功能或者bug fix),指定issue的接收人或者由团队成员自己认领,并创建对应的feature branch,这点gitlab比较强大,可以自动创建issue对应的功能分支,github好像没有这个功能,需要开发人员手工创建并关联到issue


    git.png
  2. 负责处理的issue的同事Bob checkout这个特性分支(首次开发的话也可以clone这个仓库并切换到该功能分支),注意本地的分支名字需要和远程保持一致,否则push的时候会有问题

I:\msaworkspace\bocsh-service-base>git checkout -b 1-test-issue origin/1-test-issue
Switched to a new branch '1-test-issue'
Branch '1-test-issue' set up to track remote branch '1-test-issue' from 'origin'.

使用git branch查看,发现已经checkout成功并切换到1-test-issue这个分支上了,并且本地的1-test-issue和远程仓库的1-test-issue分支已经建立了追踪关系

I:\msaworkspace\bocsh-service-base>git branch
* 1/test/issue
  master
  1. Bob在特性分支上进行工作,并每日push代码
I:\msaworkspace\bocsh-service-base>git commit -am "test issue track"
[1-test-issue 08972ca] test issue track
 1 file changed, 1 insertion(+)

I:\msaworkspace\bocsh-service-base>git push
Enumerating objects: 17, done.
Counting objects: 100% (17/17), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (9/9), 632 bytes | 316.00 KiB/s, done.
Total 9 (delta 3), reused 0 (delta 0)
remote:
remote: To create a merge request for 1-test-issue, visit:
remote:   http://22.196.66.28/7310754/bocsh-service-base/merge_requests/new?merge_request%5Bsource_branch%5D=1-test-issue
remote:
To http://22.196.66.28/7310754/bocsh-service-base.git
   498d77f..08972ca  1-test-issue -> 1-test-issue

这边注意Bob直接使用了git commit -am参数
这个相当于

git add .
git commit -m

同时因为指定了跟踪关系,所以可以直接用git push命令进行推送,git会自动把当前的活动分支的代码push到远程的对应分支上去(还记得前面说的建立对应跟踪关系吗),同时git提示我们可以create a merge request去申请把1-test-issue分支合并入master主干
同时项目管理人员(一般是这个repo的owner或者maintainer)还可以通过点击issue页面对应的分支,查看该分支是否被认领,以及该分支的工作进度(Bob,你有木有每天认真干活啊)

git2.png

git3.png
  1. Bob认为功能完成并本地测试通过,在gitlab页面上提交一个merge request


    git4.png

    title这边填写本次MR的标题,description这边填写主要提交的内容,注意必须要包含Closes #1关键字,这样在merge成功后会自动关系关联的issue(gitlab真的很方便,github里面这些都是要自己手写的)

git5.png

这里的选项可以指定审核人,给MR打标签等等操作,注意有两个选项

  • Remove source branch when merge request is accepted.
    这个会在合并成功后自动删除对应的功能分支
  • Squash commits when merge request is accepted.
    在合并后自动创建一个commit节点,因为git的合并有两种模式,快进模式只会直接改变HEAD指针的位置,不会创建commit id,这边为了流程清晰还是建议创建一个commit id
  1. maintainer审查代码,确认ok后将合并入master,同时删除该特性分支,并根据#close这样的关键字自动关闭issue


    git6.png

    如果项目集成了gitlab ci的话,这边还能看到持续集成的结果,从上面的页面看到持续集成pipeline的测试和构建也都通过了,点击change选项卡可以查看改动的地方,审核无误后点击merge按钮就可以合并入master了


    git7.png

    这边看到已经成功合并入主干,同时这个特性分支也自动删除,并且自动关闭了关联的issue
  2. 如果是准备上线的版本,那在合并成功后还需要打tag,以便于版本的追踪,我们这边设置为1.0版本


    git8.png

    版本打成功后,在tag页面可以看到历史版本记录以及对应的commit id


    git9.png

总结:基于issue的项目管理(FDD),非常便于项目的跟踪和代码审核、版本历史检索等,中小型团队建议实施github flow工作流模型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容