管理着所有人的代码提交,还可以进行投票

01-25 16:01 来源:互联网 编辑:小狐 933人阅读

管理着所有人的代码提交,还可以进行投票(图1)

作为一个人员,每天必不可少要提交代码,但是你真的懂代码提交吗?

这篇文章带领大家熟悉一下常用的代码提交方式,大家可以根据自己所在公司的模式对号入座。

代码提交方式可以用一个专业术语描述:代码工作流。

在 SVN 时代大家会使用集中式工作流,所有人都往一个主库分支合入代码;随着技术的演进,以 Git 为代表的分布式代码工具横空出世,在 Git 的基础上又逐渐出现了多种代码工作流:功能分支工作流,Gitflow 工作流,Forking 工作流。

搬好小板凳,下面一一为大家讲解。

集中式工作流

集中式工作流这种工作方式对于使用过 SVN 的同学想必会非常的熟悉,让我们思考下在 SVN 下的协作体验,不同的同学需要依次将本地的修改提交到,如果有冲突就先解决本地的冲突再提交,这个过程中远端的就像是一个集中者,着所有人的代码提交, 所以 SVN 的协作流程就是典型的集中式工作流。

管理着所有人的代码提交,还可以进行投票(图2)

如果切换到 Git 来维护代码仓,但是人员又对 Git 的分支模式不熟悉,能不能用 Git 实现类似的集中式工作流呢?

答案是当然可以。

管理着所有人的代码提交,还可以进行投票(图3)

每个人员将远程仓库的代码 clone 下来变成了属于自己的本地仓库,提交代码时先提交至本地仓库,再推送到远程仓库。

这种模式相比 SVN 只是多了一个本地仓库而已,有了 SVN 的经验人员也很快能熟悉这种模式,在前些年有很多公司都是将 Git 作为 SVN 来用的。

从提交记录来看,集中式工作流通常是一条直线往前走,如下图:

管理着所有人的代码提交,还可以进行投票(图4)

集中式代码提交流程

小结: 这种模式不推荐大家使用,因为完全没有发挥出 Git 的作用,类似于用倚天剑屠龙刀来切菜,太浪费了。

功能分支工作流

集中式工作流有一个很大的问题,随着团队内人员不断增多,大家每一次提交代码都可能会遇到冲突,提交代码一分钟,解决冲突一小时。

管理着所有人的代码提交,还可以进行投票(图5)

功能分支工作流

在功能分支工作流下,不会直接将代码合入到主干分支(master)通常是通过其他分支提交 MR(Merge Request)这使得集成一些自动化操作变得简单可行了。

提交 MR 之后团队成员开始围观你写的代码,可以提交检视意见(code review)还可以进行投票(vote)团队 committer 据此合入或者驳回你的 MR。

管理着所有人的代码提交,还可以进行投票(图6)

代码提交流程

新功能大量合并到 master 分支后容易造成 master 分支质量不稳定,不稳定会有什么问题?

比如线上突然有个 bug 要解决,可能只需要修改一行代码就能解决,但是 master 分支已经合入了大量新特性,人员还没来得及,那最稳妥的办法就是将代码回退到上一次发版本的时间节点,基于这个节点再修改一行代码,是不是太麻烦了?

为了解决这些问题,Vincent Driessen 大佬基于实践总结了一套 Git 分支的流程和规范,下面详细介绍一下。

Gitflow 工作流

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

和功能分支工作流相比, Gitflow工作流没有增加任何新的概念或命令,它给不同的分支指定了特定的角色,定义它们应该如何、什么时候交互。除了功能分支之外,还为准备发布、维护发布、记录发布分别使用了单独的分支。

Gitflow 常见分支:

主分支:master 分支

master 分支的代码是可以直接部署到生成环境的,为了保持稳定性一般不会直接在这个分支上修改代码,都是通过其他分支合并过来的。

主分支:develop 分支

develop 分支是主分支,包含所有要发布到下一个release的代码,主要是由 feature 分支合并过来的。

临时分支:feature 分支

feature 分支主要是用来一个新特性,一旦完成会合入 develop 分支,feature 分支也随即删除掉。

临时分支:release 分支

当需要一个发布一个新 release 版本时,会基于 develop 分支创建一个 release 分支,经过人员充分后再合入 master 分支和 develop 分支。

临时分支:hotfix 分支

当在生成环境发现新的 Bug 时候,如果需要紧急修复,会创建一个 hotfix 分支, 充分后合入 master 和 develop 分支,随后删除该分支。

各分支如何配合工作?

master/develop 分支

原则上 master 分支上所有的 commit 都应该打上 Tag,因为一般情况下 master 不存在,直接 commit。

devlop分支 是基于 master分支创建的,与 master 分支一样都是主分支,不会被删除。

管理着所有人的代码提交,还可以进行投票(图7)

主分支工作流程

feature 分支

通常一个独立的特性都会基于 develop 拉出一个 feature 分支,feature 分支之间没有任何交互,互不影响。feature 分支一旦完成后会立马合入 develop 分支(采用 merge request 或者 pull request)feature 分支的生命周期也随之结束。

管理着所有人的代码提交,还可以进行投票(图8)

feature 分支工作流程

release 分支

通常一个迭代上线会拉一个 release 分支,人员完毕所有的代码都已合入 develop 分支,这时候会基于 develop 分支拉出一个 release 分支,人员基于该分支进行。

管理着所有人的代码提交,还可以进行投票(图9)

release 分支工作流程

hotfix 分支

hotfix 分支基于 master 分支创建,完后需要同时回合到 master 和 develop 分支,同时在 master 上打一个 tag。

管理着所有人的代码提交,还可以进行投票(图10)

hotfix 分支工作流程

分支命名规范

团队内部可以约定每个分支的命名样式,这里举个例子,大家可以参考:

feature 分支:以 feature_开头,如 feature_order

tag 标记:如果是 release 分支合并,则以 release_开头,如果是 hotfix分支合并,则以 hotfix_开头。

Forking 工作流

Forking 工作流是以 Github 为代表的一种代码协作方式,者通过克隆(fork)源仓库进行编写代码,一旦完成会发起 pull request,源仓库可以选择是否接受该 PR。

下面通过 Github 详细讲解 Forking 工作流模式。

随便找一个Github 开源项目:

右上角有三个按钮:Watch,Star,Fork

Fork 本意是分叉,实际上是克隆的意思,点了之后会将该项目拷贝一份到自己的 github 远程仓库中。

管理着所有人的代码提交,还可以进行投票(图11)

fork 示例

在本地执行 git clone 命令将代码克隆到本地,一顿修改操作后提交代码并 push到个人远程仓库中,在界面上发起 pull request,项目的原会看到你提交的 PR,根据提交的质量可以选择接受或拒绝。

管理着所有人的代码提交,还可以进行投票(图12)

Github 工作流程

Forking 工作流非常适合于类似 Github 这种开源项目,任何一个者都可以通过 fork + pull request 向项目中贡献代码。

总结

文章介绍了四种工作流,分别是 集中式工作流,功能分支工作流,Gitflow 工作流,Forking 工作流。

集中式工作流在 SVN 时代比较常见,切到 Git 后不建议再使用这种方式了。

功能分支工作流通常是一个主干 master 分支 + 多个 feature 分支,一般适用于小团队。

Gitflow 工作流是在功能分支工作流的基础上进一步演进而来,采用 master + develop 双主分支再加上多个临时功能分支,这是一个非常成熟的代码协作的方式,推荐大家使用。

Forking 工作流主要采取 fork + pull request 的模式进行协作,主要用于开源项目。

最后,这四种工作流方式各有特色,团队可根据自身的特点去选择,不必严格拘泥于某一种方式,适合自己的才是最优的。

大家学会了吗?

☞ 支持 RISC-V 芯片的 Android 来了!

本文相关词条概念解析:

分支

分支所属现代词,指的是从一个系统或主体中分出来的部分。

代码

代码就是程序员用开发工具所支持的语言写出来的源文件,是一组由字符、符号或信号码元以离散形式表示信息的明确的规则体系。代码设计的原则包括惟一确定性、标准化和通用性、可扩充性与稳定性、便于识别与记忆、力求短小与格式统一以及容易修改等。源代码是代码的分支,某种意义上来说,源代码相当于代码。在现代程序语言中,源代码可以是以书籍或者磁带的形式出现,但最为常用的格式是文本文件,这种典型格式的目的是为了编译出计算机程序。计算机源代码的最终目的是将人类可读的文本翻译成为计算机可以执行的二进制指令,这种过程叫做编译,它由通过编译器完成。

上一篇 : 【今年上海将推动国产大飞机 C919 取得适航证并交付首架】

下一篇 : 苹果表示很熟悉,Android,正在讨论的快捷方式是双击背面

精彩推荐

科技排行