0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

腾讯是如何使用Git?

智能感知与物联网技术研究所 来源:通信信号处理研究所 2020-08-10 15:02 次阅读

开发人员在日常开发过程中,不可避免地会使用到代码的版本控制工具,如 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 更好地为我们服务!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8933

    浏览量

    85049
  • 代码
    +关注

    关注

    30

    文章

    4717

    浏览量

    68197
  • Git
    Git
    +关注

    关注

    0

    文章

    196

    浏览量

    15715

原文标题:开眼了,腾讯是如何使用 Git ?

文章出处:【微信号:tyutcsplab,微信公众号:智能感知与物联网技术研究所】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ubuntu下的vscode插件安装idf时,总是找不到git,为什么?

    总是提示:Git is not found in current environment 但是我已经在setting.json下设置了\"git.path\": \"/bin/git\" 同行,命令行里查看
    发表于 06-21 07:16

    通过git命令获取ESP8266_RTOS_SDK失败如何解决?

    本人使用的硬件平台为esp8266,开发环境为ubuntu22.04。在通过git命令获取ESP8266_RTOS_SDK失败,通过上网搜索尝试了很多方法无效。具体情况如下
    发表于 06-07 07:26

    请问下使用IDF怎么做用git做版本控制?

    请问下使用IDF怎么做用git做版本控制?是保存自己应用部分的代码还是整个SDK都要保存,但是整个框架都是官方下的,有没必要保存,求各位大神告知下你们怎么处理的。
    发表于 06-06 07:15

    Git发布新版本 修补五处安全漏洞 包含严重远程代码执行风险

    CVE-2024-32002漏洞的严重性在于,黑客可通过创建特定的Git仓库子模块,诱骗Git将文件写入.git/目录,而非子模块的工作树。如此一来,攻击者便能在克隆过程中植入恶意脚本,用户几乎无法察觉。
    的头像 发表于 05-31 10:09 534次阅读

    飞凌ElfBoard ELF 1板卡-ubuntu18.04 git安装及基本使用

    1.安装gitsudo apt-get install git 2.git初始化git init 3.设置用户名和邮箱git config --global user.name \"你
    发表于 03-21 16:23

    蓝牙 | 软件:Git管理高通的ChipCode项目

    最近发现大家在高通chipcode网站上下载不了代码,小编一直使用git的方式获取新版本代码,没有遇到什么阻碍。于是小编到新主机上尝试下载代码的压缩包和git代码,都遇到了问题。由于压缩包是高通自己
    的头像 发表于 01-26 08:29 345次阅读
    蓝牙 | 软件:<b class='flag-5'>Git</b>管理高通的ChipCode项目

    克服PLC编程的难题—基于Git的软件

    Git是一种分布式版本控制系统,它可以记录文件的修改历史和版本变化,并可以支持多人协同开发。
    的头像 发表于 01-22 09:30 902次阅读
    克服PLC编程的难题—基于<b class='flag-5'>Git</b>的软件

    Git开发者关注内存安全问题,探讨引入Rust语言

    根据最新披露的邮件讨论,Git开发团队热议在Git项目中引入Rust的可行性。作为一种开源的分布式代码版本管理工具,广泛运用于各种开发项目。尽管现在Git项目主要以C与Python为主要开发语言,但探讨显示,引入Rust能显著降
    的头像 发表于 01-15 14:23 551次阅读
    <b class='flag-5'>Git</b>开发者关注内存安全问题,探讨引入Rust语言

    GIT(分布式版本控制系统)的工作原理

    都是完整的,功能更强大,自然而然操作更复杂一些。git在本地也是以git版本库的形式管理,可以在本地做一些修改,然后commit到本地的版本库,最后push到服务器。
    的头像 发表于 12-21 16:09 776次阅读
    <b class='flag-5'>GIT</b>(分布式版本控制系统)的工作原理

    Git命令解决常见场景记录

    本文主要归纳一下git的学习记录,在开发期间发现了git在sourcetree的处理不是很好,对于多选文件的丢弃这点不是很方便,所以做一个记录,由于项目中有新建的文件,所以被识别为未跟踪的文件,但我
    的头像 发表于 12-20 09:44 401次阅读
    用<b class='flag-5'>Git</b>命令解决常见场景记录

    git切换远程地址分支方式

    git remote set-url origin URL】 更换远程仓库地址,URL为新地址。
    的头像 发表于 12-18 09:35 2202次阅读

    【ELF 1开发板试用】+ 8.2 MQTT开发——连接腾讯云【原创】

    MQTT开发——连接腾讯云 前文我们基于文档中提供的项目教程,复现ELF 1连接阿里云物联网平台,进行了MQTT开发,复现后,笔者就想“为何不试试其它平台”,抱着整活学习的心,腾讯云的MQTT开发
    发表于 12-15 23:10

    Git命令之本地分支与远程分支关联和解除

    在实际的工作生活中,往往需要将本地的分支和远程分支关联,这样我们就可以使用git pull命令来更新拉取最新的代码,并使用git push命令将自己本地的修改推送到远程仓库。但是如果此时你本地关联
    的头像 发表于 12-15 09:27 2887次阅读
    <b class='flag-5'>Git</b>命令之本地分支与远程分支关联和解除

    git命令的基本使用

    git config 第一次使用git或者刚安装的git时,使用此命令设置身份Name 和 Eamail 地址。并且每次提交时会使用此信息。
    的头像 发表于 12-11 13:53 867次阅读

    Mozilla Firefox开发将完全转向Git,放弃Mercurial

    目前相关事项仍在规划中,预计至少六个月后才会开始全面的 Git 过渡。过渡完成后,Mercurial 将从 Firefox 开发工作流程中完全淘汰。
    的头像 发表于 11-23 16:08 604次阅读
    Mozilla Firefox开发将完全转向<b class='flag-5'>Git</b>,放弃Mercurial