团队中的 Git 实践

作者:欧雷
原文地址:
https://ourai.ws/posts/working-with-git-in-team/

在 2005 年的某一天,Linux 之父 Linus Torvalds 发布了他的又一个里程碑作品——Git。它的出现改变了软件开发流程,大大地提高了开发流畅度!直到现在仍十分流行,完全没有衰退的迹象。

本文不是一篇 Git 入门教程,这样的文章一搜一大把,我是要从具体实践角度,尤其是在团队协作中,阐述如何去好好地应用 Git。既然是讲在团队中的应用实践,我就尽可能地结合实际场景来讲述。

热身运动

为了将我们的思想调节到一个频道上,在进入正题之前,有些事情是一定要讲清楚的。

分支模型

Git 的一大特点就是可以创建很多分支并行开发,正因为它的灵活性,团队中如果没有一个成熟的分支模型的话将会是一团糟。

混乱的分支
混乱的分支

有个很成熟的叫「Git Flow」的分支模型,它能够应对 99% 的场景,剩下的那 1% 留给几乎不存在的极度变态的场景。

需要注意的是,它只是一个模型,而不是一个工具;你可以用工具去应用这个模型,也可以用最朴实的命令行。所以,重要的是理解概念,不要执着于实行的手段。

简单说来,Git Flow 就是给原本普普通通的分支赋予了不同的「职责」:

  • master——最为稳定功能最为完整的随时可发布的代码;
  • hotfix——修复线上代码的 bug;
  • develop——永远是功能最新最全的分支;
  • feature——某个功能点正在开发阶段;
  • release——发布定期要上线的功能。

看到上面的「master」和「develop」加粗了吧?代表它们是「主要分支」,其他的分支是基于它们派生出来的。主要分支每种类型只能有一个,派生分支每个类型可以同时存在多个。各类型分支之间的关系用一张图来体现就是:

Git Flow 模型
Git Flow 模型

更多信息可参考 xirong 所整理的《Git工作流指南》。

工具选择

一直不喜欢「**最好用」这种命题,主观性太强,不会有一个结论。对于工具的选择,我一直都是秉承「哪个能更好地解决问题就用哪个」这个原则。所以,只要不影响到团队,用什么工具都是可以接受的。但根据多数开发人员的素质情况来看,建议使用图形化工具,例如 SourceTree。如果想用命令行,可以啊!先在心里问下自己:「我 Git 牛逼不?会不会惹麻烦给别人?」

在团队中应用 Git Flow 时,推荐使用 SourceTree 与 GitLab 配合的形式:

  1. 用 SourceTree 创建 feature 等分支以及本地的分支合并、删除;
  2. 用 GitLab 做代码审核和远程的分支合并、删除。

SourceTree 和 GitLab 应该是相辅相成的存在,而不是互相取代。

习惯养成

如果一个团队在使用 Git 时没有一些规范,那么将是一场难以醒来的噩梦!然而,规范固然重要,但更重要的是个人素质,在使用 Git 时需要自己养成良好的习惯。

提交

如何去写一个提交信息,《Git: 教你如何在Commit时有话可说》中做了很好的说明。在具体开发工作中主要需要遵守的原则就是「使每次提交都有质量」,只要坚持做到以下几点就 OK 了:

  1. 提交时的粒度是一个小功能点或者一个 bug fix,这样进行恢复等的操作时能够将「误伤」减到最低;
  2. 用一句简练的话写在第一行,然后空一行稍微详细阐述该提交所增加或修改的地方;
  3. 不要每提交一次就推送一次,多积攒几个提交后一次性推送,这样可以避免在进行一次提交后发现代码中还有小错误。

假如已经把代码提交了,对这次提交的内容进行检查时发现里面有个变量单词拼错了或者其他失误,只要还没有推送到远程,就有一个不被他人发觉你的疏忽的补救方法——:

首先,把失误修正之后提交,可以用与上次提交同样的信息。

修改前的提交记录
修改前的提交记录

然后,终端中执行命令git rebase -i [SHA],其中 SHA 是上一次提交之前的那次提交的,在这里是3b22372

修改提交节点
修改提交节点

最后,这样就将两次提交的节点合并成一个,甚至能够修改提交信息!

修改后的提交记录
修改后的提交记录

谁说历史不可篡改了?前提是,想要合并的那几次提交还没有推送到远程!

推送

当自己一个人进行开发时,在功能完成之前不要急着创建远程分支。

拉取

请读张文钿所写的《使用 git rebase 避免無謂的 merge》。

合并

在将其他分支的代码合并到当前分支时,如果那个分支是当前分支的父分支,为了保持图表的可读性和可追踪性,可以考虑用git rebase来代替git merge;反过来或者不是父子关系的两个分支以及互相已经git merge过的分支,就不要采用git rebase了,避免出现重复的冲突和提交节点。

工具配置

在使用 SourceTree 时,进行配置之后可以将一些规范性的东西自动化处理。

按下 command + , 调出「Preferences」界面并切换到「Git」标签:勾选「Use rebase instead of merge by default for tracked branches」,这样在点「Pull」按钮拉取代码时会自动执行git pull --rebase;勾选「Do not fast-forward when merging, always create commit」以在每次合并时创建新的提交节点。

「Preferences」界面的「Git」标签
「Preferences」界面的「Git」标签

工作流程

在创建项目仓库后一定要把主要分支,也就是 master 和 develop 给保护起来。通过 GitLab 为那两个分支设置权限,只有各项目的负责人可以进行推送和删除等操作。

除了主要分支的名字是固定的之外,派生分支是需要自己命名的,这里就要有个命名规范了。强烈推荐用如下形式:

  • feature 分支:按照功能点(而不是需求)命名;
  • release 分支:用发布时间命名,可以加上适当的前缀;
  • hotfix 分支:GitLab 的 issue 编号或 bug 性质等。

另外还有 tag,用语义化的版本号命名。

开发功能

在确定发布日期之后,将需要完成的内容细分一下分配出去,负责某个功能的开发人员利用 SourceTree 所提供的 Git Flow 工具,创建一个对应的 feature 分支。如果是多人配合的话,创建分支并做一些初始化工作之后就推送创建远程分支;否则,直到功能开发完毕要合并进 develop 前,不要创建远程分支。

功能开发并自测之后,先切换到 develop 分支将最新的代码拉取下来;再切换回自己负责的 feature 分支把 develop 分支的代码合并进来,合并方式参照上文中的「合并」;如果有冲突则自己和配合的人一起解决;最后,到 GitLab 上创建合并请求(merge request)给项目负责人。

项目负责人在收到合并请求时,应该先做下代码审核看看有没有明显严重的错误;有问题就找开发人员去修改,没有就接受请求并删除对应的 feature 分支。

测试功能

在将某次发布的所需功能全部开发完成时,负责测试的人创建一个 release 分支部署到测试环境进行测试;若发现了 bug,相应的开发人员就在 release 分支上,或者基于 release 分支创建一个分支进行修复。

发布功能

当确保某次发布的功能可以发布时,负责发布的人将 release 分支合并进 master 和 develop 并打上 tag,然后打包发布到线上环境。

建议打 tag 时,在信息中详细描述这次发布的内容,如:添加了哪些功能,修复了什么问题。

问题修复

当发现线上环境的代码有小问题或者做些文案修改时,相关开发人员就在本地创建 hotfix 分支进行修改,具体操作参考「开发功能」。

如果是相当严重的问题,可能就得回滚到上一个 tag 的版本了。

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

推荐阅读更多精彩内容

  • 多种多样的工作流使得在项目中实施Git时变得难以选择。这份教程提供了一个出发点,调查企业团队最常见的Git工作流。...
    JSErik阅读 4,367评论 2 8
  • 自章子怡出道以来,我就非常喜欢她,只是看她的电影少了点,最近正在补看呢!感觉她青春阳光,富有朝气,美丽动人,招人喜...
    超级赋能王张胜萍阅读 1,158评论 4 11
  • 开始的开始,我们都没有勇气,无论是第一次上台演讲,第一次出远门,还是第一次在陌生的城市乘地铁······但是,生...
    干姜阅读 145评论 0 1
  • 渐渐发现,自己选择的路有了一些偏差。渐渐发现,生活不易,有时候不愿意,也不能真性情,袒露自己。压抑…… ...
    优优宝贝11阅读 213评论 0 0
  • 昨天一天下来,确实累,脚后跟都可以感觉酸的紧。早上醒来,整个身体都无力,特别是腿部。不仅是我,儿子昨天也累,回来的...
    玲萍阅读 138评论 4 0