Git的艺术—分支管理

腾讯工蜂Git:基于Git的企业级协作开发解决方案,腾讯未来研发关键系统

https://code.tencent.com

腾讯工蜂用户:赵秀雯

前言

Git的开发者—— Linus Benedict Torvalds,22岁就创建了Linux系统,发展到2005年的时候,用了仅两周的时间写了一个分布式版本控制系统,也就是Git!向这位天才致敬。

在管理项目代码过程中,不知道大家有没有遇到这样的问题,这里举个例子:平台首页要开发 A 功能,因此修改了 index.css 这个文件,把文件提交到 SVN 同步给前端开发后,前端开发可以继续折腾 A 功能的技术实现了;在 A 功能的开发阶段,又接到了外网反馈的一个紧急 bug,于是马上修改了 index.css 。在即将要发布的时候,测试发现首页某些模块的效果却全乱套了。

原来,是因为 index.css 里面集成了 A 功能的代码,但因为 A 功能还在开发阶段没有上线,因此影响了现有的首页。本来开开心心地以为修改了一个 bug,却带来了另一个 bug,于是原本打算晚上去网吧吃鸡的计划泡汤了,只能乖乖地留下来加班了。

怎样能够避免这种情况发生呢?马上你的脑回路给你提供了下面这几种选择:

a. 乖乖地把 index.css 版本回退到 A 功能的上一个版本,修复外网 bug 发布后,再继续把 A 功能的相关代码重新合并到 index.css 里给前端开发继续开发;

b. 把带有 A 功能的文件重新命名为 index2.css,现网用的文件依然是 index.css,紧急 bug 修复的时候同时修改 index.css 和 index2.css;

c. 老子不干了,今晚就是要去吃鸡。

a 选项候因为版本的回退会不会给正在进行的 A 功能开发造成影响呢?b 选项修复的时候却需要修改两份文件,并且可能针对一个页面一份样式在本地却存在 index.css、index2.css、index3.css...... c 选项,确定你今晚能吃鸡,明天还能好好地待在公司吃免费早餐?

废话少说(虽然铺垫得够长的),为了完美解决上述的问题,这里主要要介绍Git的分支管理。

Git是什么?

一句话概括,Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。因为项目的历史问题,之前一直代码版本控制系统一直用的都是 SVN 。而下面的 SVN 和 Git 的区别,是你需要知道的:

1. SVN 是集中式的,Git 是分布式。

2. SVN 是把内容按文件方式存储,而 Git 是按元数据方式存储。

3. Git 分支和 SVN 的分支不同:分支在 SVN 中一点不特别,就是版本库中的另外的一个目录。

4. SVN 有全局的版本号,这样子你就可以根据版本号知道每次提交的先后顺序了,但 Git 没有。

5. Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

Git的分支管理

一、 分支简介

关键词:master、HEAD、指针

当创建 Git 时,系统会默认创建一条分支,通常我们默认这条分支为叫主分支,即 master 。前文有提到,Git 是按元数据方式存储,保存一系列不同时刻的文件快照。master 其实是一个指针,它会在每次的提交操作中自动向前移动,保证指向在分支上最后提交的一次内容。

而当你新建另一条分支时,Git 为你创建了一个可以移动的新的指针。比如,创建一个 featureA 分支。如图一,master 分支上已有多个提交记录,最新一次提交为 M2 。此时在当前的提交对象上创建一个 featureA 分支,也就有了新的指针指向 M2。当我们切换到 featureA 分支上时,会有一个名为 HEAD  的特殊指针,它始终指向当前所在的分支上。凭着它,我们就知道目前的所有操作是对哪个分支进行修改了。

二、分支开发实操

关键词:创建分支、切换分支、合并分支

为了避免文章开篇提到的把文件提交前发现影响了外网的样式时的情况,可以约定只在 master 分支上保留完全稳定的代码——即仅仅是已经发布或即将发布的代码。而每次开发新功能是另起分支来开发,这些分支不必保持绝对稳定,适合多个功能同时进行开发但互不影响,一旦达到了稳定状态,就可以被合并入 master 分支了。这样,就可以确保这些已完成的特性分支能够通过所有测试,并且不会引入更多 bug 之后,合并入主干分支中,等待下一次的发布。

以下用图解 Git 分支管理如何解决文章开篇的问题:

(1)目前首页的稳定版本为 M2 ,即 master 指针指向的对象。在 M2 上我们创建一条名为 featureA 的分支进行开发,开发出 M3 版,因为操作是在 featureA 分支上,并不会污染现网的样式。

(2)突然遇到了一个需要马上修复的外网 bug,于是新建 bug 分支,修复验证后切换到 master 分支合并成为 M4 并发布,因此此时 HEAD 指针指向的是当前的分支 master 。

(3)A 功能终于开发完毕要上线了,但因为 A 功能是在主干 M2 版本上做的,此时还需要在主干上将主干最新的版本 M4 和 M3 合并成为 M5 版本,当然,在合并的过程中,发生代码冲突是很常见的,毕竟版本开发的时间节点不一样,解决冲突也是代码版本管理的一个大学问,但这里不展开讨论,之后有机会可以再一起探讨写篇新的文章嘻嘻。于是 master 和 HEAD 指针都指向了 M5。而 featureA 和 bug 分支,可以根据项目需要考虑删掉。

通过 Git 的科学化代码管理,我们能够既不影响开发新的功能,也能快速迭代版本,并且还能通过 Git 的记录追溯到任何一个版本上。 

总结

本文主要通过一个例子来讲述 Git 的分支管理概念,并没有提到任何 Git 的命令,因为概念清楚了,也就可以快速地在命令表中查到自己需要哪条命令了。Git 的分支管理在多人共同开发一个项目上的优势尤其明显,如果大家都在主干上开发,那代码将变得不堪入目。一言总结,Git 也就是一个工具,用好了它将帮助我们提高工作流程的科学性以及效率,Git 是一个好东西,希望大家都能拥有它 : )


扫描以下二维码,研发管理从此高效、轻便、可靠

小广告

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏最高权限比特流

漫谈计算机组成原理(二)系统总线

从引言中,我们基本上能够了解到总线在计算机系统中的作用。但是上面的说法只是一个概论,我们需要给出更加详细的总线的作用:总线是计算机中各个部件的信息传输线。在计算...

42930
来自专栏用户2442861的专栏

高性能网络编程5--IO复用与并发编程

对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒...

12910
来自专栏Python

计算机基础之计算机硬件系统

一.计算机硬件系统概述 所谓计算机硬件系统,就是指构成计算机看得见的,摸得着的实际物理设备。 常见的计算机硬件组成主要由下图各部件组成: ? 现代计算机的结构更...

25450
来自专栏编程坑太多

『高级篇』docker之了解kubernetes(31)

PS:(梳理概念)pod里面包括N个容器,service里面包括pod,Deployment可能包括service或者是pod。

16640
来自专栏北京马哥教育

超全整理!Linux 大牛收集的Linux性能分析工具合集

本文由马哥教育面授班23期学员推荐,转载自恒生研究院,作者为董西孝,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛苦贡献与付出。 出于对Linux操作...

1.4K120
来自专栏无题

mongoDB生产环境三种模式

MongoDb在用于生产环境的三种模式,master/slaves(主从模式);replcation副本集;auto shard 分片模式 1.主从复制 ...

89150
来自专栏SDNLAB

ONOS:从DeviceSubsystem看ONOS子系统设计(1):Core层基本功能架构

言 ONOS的内核是由诸多遵循同一架构设计的子系统组成的,Device Subsystem设备子系统就是其中重要的一员。笔者将借助其源码讲解ONOSCore层的...

38980
来自专栏ThoughtWorks

DocBook 让文档版本化

image.png #ThoughtWorkers好声音# 第十六期(图片:网络) 你们都知道ThoughtWorks曾经是扛敏捷的大旗的,你们也都知道敏捷是...

33460
来自专栏数据和云

【推荐】 RAC 性能优化全攻略与经典案例剖析

ORACLE RAC凭借其卓越的容错能力和可扩展性以及对应用透明的切换能力引领了数据库高可用架构的潮流,但在实际的生产环境中,出现的性能问题非常多,对数据库的稳...

34970
来自专栏数据和云

数据库高可用和分区解决方案-MongoDB 篇

许春植(Luocs) (阿里巴巴高级数据库管理员,7年以上数据库运维管理经验,擅长MySQL、Oracle及MongoDB数据库,目前主要研究并建设Mongo...

98260

扫码关注云+社区

领取腾讯云代金券