
来源 | 欧雷 编辑 | GitHubDaily(id:GitHubDaily) 出处 | ourai.ws/posts/working-with-git-in-team/
前言
在 2005 年的某一天,Linux 之父 Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度!直到现在仍十分流行,完全没有衰退的迹象。本文要从具体实践角度,尤其是在团队协作中,阐述如何去好好地应用 Git。既然是讲在团队中的应用实践,我就尽可能地结合实际场景来讲述。
1.习惯养成
如果一个团队在使用Git
时没有一些规范,那么将是一场难以醒来的噩梦!然而,规范固然重要,但更重要的是个人素质,在使用Git
时需要自己养成良好的习惯。1.1 提交
如何去写一个提交信息,在具体开发工作中主要需要遵守的原则就是「使每次提交都有质量」,只要坚持做到以下几点就 OK 了:- 提交时的粒度是一个小功能点或者一个 bug fix,这样进行恢复等的操作时能够将「误伤」减到最低;
- 用一句简练的话写在第一行,然后空一行稍微详细阐述该提交所增加或修改的地方;
- 不要每提交一次就推送一次,多积攒几个提交后一次性推送,这样可以避免在进行一次提交后发现代码中还有小错误。


1.2 推送
当自己一个人进行开发时,在功能完成之前不要急着创建远程分支。1.3 拉取
请读张文钿所写的《使用 git rebase 避免無謂的 merge》:https://ihower.tw/blog/archives/3843。1.4 合并
在将其他分支的代码合并到当前分支时,如果那个分支是当前分支的父分支,为了保持图表的可读性和可追踪性,可以考虑用 git rebase 来代替 git merge;反过来或者不是父子关系的两个分支以及互相已经 git merge 过的分支,就不要采用 git rebase 了,避免出现重复的冲突和提交节点。2.分支管理
Git
的一大特点就是可以创建很多分支并行开发。正因为它的灵活性,团队中如果没有一个成熟的分支模型的话,那将会是一团糟。
2.1 分支模型
有个很成熟的叫Git
Flow 的分支模型,它能够应对 99% 的场景,剩下的那 1% 留给几乎不存在的极度变态的场景。 需要注意的是,它只是一个模型,而不是一个工具;你可以用工具去应用这个模型,也可以用最朴实的命令行。所以,重要的是理解概念,不要执着于实行的手段。 简单说来,Git
Flow 就是给原本普普通通的分支赋予了不同的「职责」:- master——最为稳定功能最为完整的随时可发布的代码;
- hotfix——修复线上代码的 bug;
- develop——永远是功能最新最全的分支;
- feature——某个功能点正在开发阶段;
- release——发布定期要上线的功能。

2.2 工具选择
一直不喜欢「**最好用」这种命题,主观性太强,不会有一个结论。对于工具的选择,我一直都是秉承「哪个能更好地解决问题就用哪个」这个原则。所以,只要不影响到团队,用什么工具都是可以接受的。但根据多数开发人员的素质情况来看,建议使用图形化工具,例如 SourceTree(https://www.sourcetreeapp.com)。如果想用命令行,可以啊!先在心里问下自己:「我Git
牛逼不?会不会惹麻烦给别人?」 在团队中应用Git
Flow 时,推荐使用 SourceTree 与 GitLab (https://gitlab.com/)配合的形式:- 用 SourceTree 创建 feature 等分支以及本地的分支合并、删除;
- 用 GitLab 做代码审核和远程的分支合并、删除。
3.事前准备
为了将一些规范性的东西和Git
Flow 的部分操作自动化处理,要对 SourceTree 和 GitLab 进行一下配置。3.1 SourceTree
按下 command + , 调出「Preferences」界面并切换到「Git」标签,勾选「Use rebase instead of merge by default for tracked branches」和「Do not fast-forward when merging, always create commit」。

3.2 GitLab
在创建项目仓库后一定要把主要分支,也就是 master 和 develop 给保护起来。为它们设置权限,只有项目负责人可以进行推送和删除等操作。
4.开发流程
在引入Git
Flow 之后,所有工作都要围绕着它来展开,将原本的流程与之结合形成「基于Git
Flow 的开发流程」。
4.1 开发功能
在确定发布日期之后,将需要完成的内容细分一下分配出去,负责某个功能的开发人员利用 SourceTree 所提供的 Git Flow 工具创建一个对应的 feature 分支。如果是多人配合的话,创建分支并做一些初始化工作之后就推送创建远程分支;否则,直到功能开发完毕要合并进 develop 前,不要创建远程分支。 功能开发完并自测之后,先切换到 develop 分支将最新的代码拉取下来,再切换回自己负责的 feature 分支把 develop 分支的代码合并进来。合并方式参照上文中的「合并」,如果有冲突则自己和配合的人一起解决。 然后,到 GitLab 上的项目首页创建合并请求(merge request)。


4.2 测试功能
负责测试的人创建一个 release 分支部署到测试环境进行测试;若发现了 bug,相应的开发人员就在 release 分支上或者基于 release 分支创建一个分支进行修复。4.3 发布上线
当确保某次发布的功能可以发布时,负责发布的人将 release 分支合并进 master 和 develop 并打上 tag,然后打包发布到线上环境。 建议打 tag 时在信息中详细描述这次发布的内容,如:添加了哪些功能,修复了什么问题。4.4 修复问题
当发现线上环境的代码有小问题或者做些文案修改时,相关开发人员就在本地创建 hotfix 分支进行修改,具体操作参考「开发功能」。 如果是相当严重的问题,可能就得回滚到上一个 tag 的版本了。5.额外说明
这里所提到的事情,虽非必需,但知道之后却会如虎添翼。5.1 分支命名
除了主要分支的名字是固定的之外,派生分支是需要自己命名的,这里就要有个命名规范了。强烈推荐用如下形式:- feature——按照功能点(而不是需求)命名;
- release——用发布时间命名,可以加上适当的前缀;
- hotfix——GitLab 的 issue 编号或 bug 性质等。
网友评论