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

鹅厂是如何使用Git的?看这!

点击上方Java后端,选择设为星标优质文章,及时送达来源:腾讯技术工程今天跟大家分享一点鹅厂程序员的Git使用经验。介绍四种工作流来更好地

点击上方 Java后端,选择 设为星标

优质文章,及时送达


来源:腾讯技术工程

今天跟大家分享一点鹅厂程序员的 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 -

最近整理一份面试资料《Java技术栈学习手册》,覆盖了Java技术、面试题精选、Spring全家桶、Nginx、SSM、微服务、数据库、数据结构、架构等等。
获取方式:点“ 在看,关注公众号 Java后端 并回复 777 领取,更多内容陆续奉上。
推荐阅读 
1. 13000 字的 Spring MVC 总结
2. 推荐个 Java 开源商城项目
3. 文件系统:隐匿在 Linux 背后的机制
4. 牛逼!这篇文章让我重新认识了并发编程
5. 955 不加班公司名单:955.WLB喜欢文章,点个在看 


推荐阅读
  • 双十一在家学用 Git
    对于所有的开发者来说,掌握一门代码版本控制系统都是必须的,无论是自己做项目,团队合作,工作中的合作,都离不开版 ... [详细]
  • 腾讯T3大牛亲自教你!2021大厂Android面试经验,经典好文
    本篇将由环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来等七个方面,对当前的ReactNative和Flutter进行全面的分析对比, ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • SVN安装配置和使用
    简介:SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 集成电路企业在进行跨隔离网数据交换时面临着安全性问题,传统的数据交换方式存在安全性堪忧、效率低下等问题。本文以《Ftrans跨网文件安全交换系统》为例,介绍了如何通过丰富的审批流程来满足企业的合规要求,保障数据交换的安全性。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • SVN 功能说明(简版)
    Subversion(SVN)是什么?SVN是一种版本管理系统,是开源软件的基石。即使在沟通充分的情况下,多人维护同一份源代码的一定也会 ... [详细]
  • IamsettingupApacheserverwithTortoiseSVNforalocalsourcecoderepository.Ihaveobservedt ... [详细]
author-avatar
默然b并不是我的选择
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有