热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

不熟练Git被优化了!腾讯是如何使用Git的?

点击“开发者技术前线”,选择“星标????”在看|星标|留言,真爱回复“666”,获取一份技术人专属大礼包转自公众号:腾讯技术工程因为不

点击“开发者技术前线”,选择“星标????”

在看|星标|留言,  真爱

回复“666”,获取一份技术人专属大礼包 转自公众号:腾讯技术工程

"因为不怎么会Git,自己平时合代码老出错,最近公司裁员,我被优化了",读者如是说。

今天跟大家分享一点鹅厂程序员的 Git 使用经验。

介绍四种工作流来更好地理解 Git 的项目使用流程,利用其强大的分支功能为自己的项目构筑适配的工作流。

1. 前言

开发人员在日常开发过程中,不可避免地会使用到代码的版本控制工具,如 svn、git 等等,记得在刚刚入职的时候,部门使用的主要的 VCS 工具还是 svn,期间有着非常痛苦的 download 经历,下载一份仓库花了我 2-3 个小时,相比于 svn,git 有着非常多的优势,比如仓库 clone 速度非常快、核心的分支功能等等,后续公司也在推使用 git 来维护代码仓库,完全摒弃笨重的 svn。

那么,切换到 git 来维护代码仓库,会对我们的日常开发造成影响吗?答应是显然的,首先我们需要学习 git 的基本概念与用法,然后就需要我们在具体的项目实践过程中打磨我们的 git 使用技巧,比如灵活的分支、子模块使用等等,关于 git 概念或技术上的介绍,本文不予展开,如果对 git 实现上的细节感兴趣的话,可以自行搜索学习。

接下来主要跟大家探讨的主题是 git 工作流,git 初学者可能对这个概念并不是很清晰,脑海中想到的可能是 git 的工作原理之类的,其实并不是的,git 工作流指的是多人协作过程中的 git 的使用流程,不涉及技术细节,是一种项目管理、开发约定的方式。有些同学可能觉得习得了 git 三板斧(clone、add commit、push)就算是完成了对 git 的开发认知,其实咱们可能还停留在最原始的想象之中。

2. 集中式工作流

集中式工作流,这种工作方式对于使用过 svn 的同学想必会非常的熟悉,让我们思考下在 svn 下的协作体验,不同的开发同学需要依次将本地的修改提交到服务器,如果有冲突就先解决本地的冲突再提交,这个过程中远端的服务器就像是一个集中管理者,管理着所有人的代码提交,所以 svn 的开发协作流程就是典型的集中式工作流,那切换到 git 场景下,集中式工作流的工作方式又是什么样的呢?

首先我们看下 git 的基础操作框架,如图 2.1 所示:

这里有一份中央仓库,是存放项目代码的地方,三个开发人员 A、B、C 分别在本地持有一份中央仓库的拷贝 - 本地仓库,这里相比于 svn 的框架只是多了一个本地仓库;

接下来我们再来看在项目开发进行了一段时间之后的提交日志是什么样的,如图 2.2 所示:

这里是一条最简单的 master 分支上的提交日志记录,那相比于 svn 的框架有啥区别呢,只要把 master 分支字样改成 trunk 就变成了一条 svn 的提交记录。

最后,我们考虑以下几个条件:

1、有无本地仓库2、默认分支是 master 还是 trunk3、提交操作使用 git command 还是 svn command(细节忽略)

我们可以看出 svn 下的集中式工作流同样适用于 git,只要大家把 svn 相关的概念全部切换到 git 下即可:1、认识本地仓库2、认识默认分支 master3、使用 git 的提交命令

以上三点中的前两点对于集中式工作流下的开发者其实是透明的,开发者只需要将提交命令改成 git 就可以无缝衔接 svn 下的集中式工作流!

所以,svn 切换到 git 的成本其实还是很低的,只需要你掌握 git 的基础提交命令!

git 下的集中式工作流,是一种只使用 master 主分支的开发方式,这种方式简单明了,但是缺点是不同开发人员的提交日志混杂在一起,难以定位问题。

3. 功能分支工作流

功能分支工作流,这种工作方式是以集中式工作流为基础,再为不同功能开发分配单独的功能分支来进行的;这种工作流的主干分支仍然是 master 分支,但是开发者在进行日常需求开发时不能将代码直接提交到 master 分支上,一般是为特定的需求新建一个功能分支,并且取一个具有描述性的名字,例如:feat-personal-page、issue-#1702,描述性的名称可以让其他开发者快速地明白这个功能分支的主要作用,提高不同开发者之间的协同效率;功能分支功能流的提交日志记录如图 3.1 所示:

从图中可以看出,相比于集中式工作流,分支历史看起来更加简洁、合理,让不同功能的开发进行隔离,避免不同功能代码之间产生不利的影响。

此外,在功能分支上的需求开发完成之后,我们需要将分支合并到主干分支 master 上,这时候需要进行的操作是 pull request,为什么要进行 PR 操作,而不是直接进行代码的 merge 呢,这里首先需要大家认识 PR 是什么操作,其次需要大家了解 PR 操作的意义;

功能需求开发完成之后,需要将本地功能分支推送到中央仓库的功能分支上,然后在中央仓库的功能分支上发起一个 pull request 请求去将功能分支上的修改合并到 master 分支上,这个过程一般是在 GIT 的项目主页上进行,公司内部就工蜂的项目主页,如图 3.2 所示,是 flutter 项目的某一次 PR 详情:

PR 操作给项目带来的益处有两点:1、code review2、讨论代码的公共平台

前者是每次 PR 操作发生时会通知相关者来检查待合并的代码,在检查过程中即完成了对代码的检视,这个过程保障了 master 分支上的已合并代码的健壮性;后者则是因为每次 PR 都会有一个 PR 详情主页,如图 3.2,每一个开发者都可以针对代码的实现提出自己的意见,使得讨论代码变成更加便捷高效,且为代码变更回顾提供了可能。

功能分支工作流是 git 项目开发非常灵活使用的一种方式,但是对于大型的项目而言,需要为不同的分支分配更加具体的角色。

4.Gitflow 工作流

Gitflow 工作流是目前非常成熟的一个方案,它定义了一个围绕项目发布的严格分支模型,通过为代码研发、项目发布以及维护分配独立的分支来让项目的迭代过程更加地顺畅,不同于之前的集中式工作流以及功能分支工作流,gitflow 工作流常驻的分支有两个:主干分支 master、开发分支 dev,此外针对项目研发的各个阶段,设定了特定的分支。

阶段分支常驻 master、dev 研发 feature 热修复 hotfix 发布 release

首先针对常驻分支,如图 4.1

常驻分支表示在项目提交历史中一直存在的分支,这里 master 分支主要跟踪项目正式发布的代码历史,dev 分支主要跟踪项目代码研发的提交历史;此外在 master 分支上通常会为某次版本发布分配一个标签来记录版本号,这为以后项目排查定位提供便利。

接下来,我们来看 gitflow 工作流中,代码研发阶段的工作流程。

如图 4.2 所示,开发阶段开启某一个需求时需要从 dev 分支上新建功能分支 feature,图中所示为两个 feature 分支,代表同时有两个功能在开发中,这里的 feature 分支使用跟功能分支工作流中的使用方式是一样的,在需求开发完成之后需要提交 PR 请求合并进 dev 分支,完成之后即可删除对应的功能分支。

很多时候,在需求研发过程中,线上的代码可能会出现问题,这时候需要我们进行及时的修复,这就是项目迭代过程中的热修复阶段。

如图 4.3 所示,假设我们在开发的过程中线上出现了一个 bug,这时候我们需要从 master 的标签 v0.1 上检出一份分支代码 hotfix,修复并验证好了之后,需要将 hotfix 代码分别合并到 master /dev 分支上,并在 master 的提交上打上一个标签 v0.2,这里需要将热修复的代码分别合并进两个常驻分支是因为需要保障两边代码的一致性。

最后,我们来看下项目迭代的发布阶段,我们需要将之前功能开发完成的特性发布到线上去,如图 4.4 所示

首先在 dev 分支的提交处新建 release 分支,在这个分支上进行 bug 修复、面向发布的一些任务,这个分支不做任何功能上的任务,完成之后将 release 分支再分别合并进 master/dev 分支,并在 master 提交上打上标签 v1.0,这样一个发布阶段的代码操作就完成了

最后我们来看发布之后的目前的日志记录情况,如图 4.5 所示,这里可以将没有用的分支 hotfix、release、feature 均删除了,可以看出我们的常驻分支就 master/dev,最下面的 feature 表示仍在开发中。

gitflow 工作流是目前比较很成熟的方案,它的优点有:

1、发布迭代流程更顺畅2、使得代码有了更加严谨的项目结构,方便定位排查问题

大型的项目 / 迭代速度快的推荐使用这种工作流程!

5.Forking 工作流

最后介绍一种开源项目常用的工作流 ——Forking 工作流,介绍之前首先需要了解什么是 fork 操作,如图 5.1 所示

fork 操作是在个人远程仓库新建一份目标远程仓库的拷贝,操作很简单,比如 github 上在项目的主页点击 fork 按钮即可。

明白了 fork 操作之后,我们来看下 forking 工作流的流程,如图 5.2 所示:

首先开发者 A 拥有一个远端仓库,这时候有一个开发者 C 也想参与 A 的这个项目的开发工作,那他就可以 fork 一份 A 的这个仓库,之后在 c 的个人仓库里就有了这份代码库,后续开发者 C 就可以在自己的这个项目里进行开发工作,c 在完成了某个功能的实现之后,可以给 A 的仓库发一个 PR 请求,这时候会通知到开发者 A 有新的 PR,A 如果有问题可以直接在这个 PR 里提,开发者 C 可以进行进一步的修改,最后 A 通过了 C 的这份 PR 请求,就会将 C 的代码合并进 A 的仓库,这样就完成了 A / 代码库新特性的开发。同时如果有其他开发者对 A 的项目有兴趣也会进行相同的操作。

这里注意到 开发者 B/C 并不是 A 代码库的开发人员,而是第三方开发者,所以这种工作流主要用于开源项目!

6. 总结

最后回顾下这几种 git 工作流,集中式工作流可以说是 git 工作流的基础,初学者可以无缝地从 svn 的模式切换到 git 的模式;功能分支工作流在集中式的基础上又引入了功能分支,灵活地利用了 git 的分支特性,功能分离 / PR 优化了日常工作的效率;gitflow 工作流则是为大型项目的迭代过程服务的,指定了一个严格的分支模型,使得迭代流程更加顺畅;forking 工作流则是开源项目的首选,想要为开源项目做贡献就必须要懂得这种工作流!

当然,以上描述的这些工作流并不是实际工作中 git 使用的准则,这只是一些推荐的使用方式,在具体的项目研发过程中,我们需要结合项目以及团队现状作出取舍,总结出适合自己团队的工作流,才能让 git 更好地为我们服务!

END前线推出学习交流群,加群一定要备注:研究/工作方向+地点+学校/公司+昵称(如前端+上海+上交+可可),根据格式备注,可更快被通过且邀请进群,领取一份专属学习礼包扫码加我微信进群,内推和技术交流,大佬们零距离历史推荐再见 Python,Hello Julia!CTO:不要在代码中写 set/get 方法了,逮一次罚款...再见,Kotlin !你好, Java !VS Code 成主宰、Vue备受热捧!2020 前端开发趋势指南


推荐阅读
  • 本文探讨了 TypeScript 中泛型的重要性和应用场景,通过多个实例详细解析了泛型如何提升代码的复用性和类型安全性。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 深入解析 Lifecycle 的实现原理
    本文将详细介绍 Android Jetpack 中 Lifecycle 组件的实现原理,帮助开发者更好地理解和使用 Lifecycle,避免常见的内存泄漏问题。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
  • Python应用实例大揭秘:七大令人惊叹的高阶技巧展示
    2020年,Python无疑成为了最炙手可热的编程语言,其影响力已远远超出程序员的范畴。从初学者到资深从业者,甚至小学生,都在纷纷加入Python的学习热潮中。凭借其低门槛、易上手和强大的功能,Python正逐渐成为各行业不可或缺的工具。本文将揭示七个令人惊叹的Python高级应用技巧,帮助读者进一步提升编程水平。 ... [详细]
  • 【实例简介】本文详细介绍了如何在PHP中实现微信支付的退款功能,并提供了订单创建类的完整代码及调用示例。在配置过程中,需确保正确设置相关参数,特别是证书路径应根据项目实际情况进行调整。为了保证系统的安全性,存放证书的目录需要设置为可读权限。值得注意的是,普通支付操作无需证书,但在执行退款操作时必须提供证书。此外,本文还对常见的错误处理和调试技巧进行了说明,帮助开发者快速定位和解决问题。 ... [详细]
  • 工作8年后薪资从1万跃升至7万,网友惊叹:本科学历实属难得
    一位本科毕业生在工作8年后,凭借扎实的技术能力和不断的学习提升,成功将月薪从1万元提高到7万元,引发了网友们的广泛赞叹。这一成就不仅体现了个人的努力与坚持,也反映了当前技术领域对高素质人才的迫切需求。 ... [详细]
  • 在过去,我曾使用过自建MySQL服务器中的MyISAM和InnoDB存储引擎(也曾尝试过Memory引擎)。今年初,我开始转向阿里云的关系型数据库服务,并深入研究了其高效的压缩存储引擎TokuDB。TokuDB在数据压缩和处理大规模数据集方面表现出色,显著提升了存储效率和查询性能。通过实际应用,我发现TokuDB不仅能够有效减少存储成本,还能显著提高数据处理速度,特别适用于高并发和大数据量的场景。 ... [详细]
author-avatar
手机用户2502892557
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有