利用git 进行多人协作开发
现在,大部分项目都是用 git 来管理代码的,但当项目变大、多人协作时,git 的使用就变得复杂了,这时就需要在 git 使用的流程上来思考如何更优的使用 git。
对于大部分 web 项目而言,并不像软件、APP 项目一样有版本的划分,而是不断的更新、迭代,这就使得 web 项目的 git 使用要复杂一些,需要管理好哪些是正在开发的代码、哪些是提交测试的代码、哪些是已经上线的代码、多人共同开发时如何避免代码冲突与线上新代码被旧代码覆盖等等。
1. 一个分支
如果项目比较小,不频繁更新时,可以只用 master
一个分支。
使用流程:
- 提交代码到本地
master
分支,并推送到远程master
分支 - 持续集成构建或本地构建,然后上传到服务器
上传到服务器有两种方式:
- 持续集成构建,然后同步到服务器
- 本地构建,然后上传到服务器(为了简洁清晰,后面的图例中会隐藏这种方式)
2. 开发分支与个人分支
如果项目稍大些,频繁更新时,就需要另外一个开发分支:
master
:主分支,对应线上代码dev
:开发分支,对应开发代码
使用流程:
- 提交代码到本地
dev
分支 - 在需要构建项目时
merge
到本地master
分支,并推送到远程master
分支 - 持续集成构建,然后同步到服务器
如果是多人参与的项目,就需要个人开发分支了:
master
:主分支,对应线上代码man1
:个人man1
开发分支man2
:个人man2
开发分支
使用流程:
- 提交代码到本地
man1
分支(以man1
个人为例) - 在需要构建项目时
merge
到本地master
分支,并推送到远程master
分支(有可能需要先pull
远程的代码) - 持续集成构建,然后同步到服务器
在适当的时候,每一个个人分支(如 man1, man2
)都需要 pull
一下 master
分支,以保证自己本地的代码的版本不会低于服务器。
3. 多个服务器环境
如果项目比较大,并且对应多个服务器环境(测试环境、产品环境):
master
:主分支prod
:产品分支,对应产品服务器环境test
:测试分支,对应测试服务器环境dev
:开发分支
使用流程:
构建测试环境:
- 提交代码到本地
dev
分支 - 在需要构建项目时
merge
到本地test
分支,并推送到远程test
分支 - 持续集成构建,然后同步到测试服务器
构建产品环境可以由远程的 test
分支 merge
到远程 prod
分支进行持续集成构建,也可由本地 dev
或 test
分支 merge
到本地 prod
分支,并推送到远程 prod
分支进行持续集成构建。
如果是多人参与的项目,就需要个人开发分支了:
master
:主分支prod
:产品分支,对应产品服务器环境test
:测试分支,对应测试服务器环境man1
:个人man1
开发分支man2
:个人man2
开发分支
使用流程:
构建测试环境:
- 提交代码到本地
man1
分支(以man1
个人为例) - 在需要构建项目时
merge
到本地test
分支,并推送到远程test
分支(有可能需要先pull
远程的代码) - 持续集成构建,然后同步到测试服务器
构建产品环境可以由远程的 test
分支 merge
到远程 prod
分支进行持续集成构建,也可由本地 man1
或 test
分支 merge
到本地 prod
分支,并推送到远程 prod
分支进行持续集成构建。
在适当的时候,每一个个人分支(如 man1, man2
)都需要 pull
一下 prod
分支(如有需要,也可以 pull
test
分支),以保证自己本地的代码的版本不会低于服务器。
4. 多个需求同时开发
有时候会有多个需求同时开发,并且相互独立,为了不影响每个需求的测试与上线,需要为每个需求创建一个分支。
master
:主分支prod
:产品分支,对应产品服务器环境test
:测试分支,对应测试服务器环境man1
:个人man1
开发分支man2
:个人man2
开发分支task1
:需求task1
开发分支task2
:需求task2
开发分支
使用流程:
构建测试环境与之前的步骤一致,但构建产品环境时,为了保证各个需求不相互影响,一般由本地直接合并到 prod
分支:
- 本地
task1
分支merge
到本地prod
分支,并推送到远程prod
分支进行持续集成构建 - 每一个个人分支(如
man1, man2
)都需要pull
一下prod
分支,以保证自己本地的代码的版本不会低于服务器 - 最后删除
task1
分支
5. 多人协作开发修改公共文件
因为不同分支修改同一个文件而导致的文件冲突是多人协作开发中比较常见的问题之一,避免这种问题的思路主要有以下的几种:
- 在代码层面,尽量避免多个成员都会改动的文件,尽量将代码分解到每个人只负责自己的那块代码,不需要去改别人的代码
- 在工程层面,尽量减少公共文件,尽量每个文件只由一个人负责
- 在 git 层面,如果有必要,可以单独建一个分支,用于更新某些公共文件,并及时的更新到其他分支
6. 其他分支
有一些常用的分支,可能我们会用到:
bug
分支:用于紧急修复产品环境的bug
7. 根据情况调整、简化流程
上面的图例只有测试服务器和产品服务器,更多服务器类型的工作流程是类似的;图例也只有 man1
和 man2
两个个人分支,更多个人分支的工作流程也是类似的。
上面的图例主要用于以下特点的项目(需要把整个项目打包成一个整体):
- 单页面 web 前端应用,整个项目只有一个 html 文件,页面之间的切换由本地路由控制,每次更新到服务器都需要打包所有页面
- Java、Go 等后端应用,每次都需要打包成一个整体,可能是一个文件,或者一批文件(不打包成一个整体的方式除外,比如分散 java class 文件)
- 使用持续集成构建的方式更新代码到服务器
这样做主要是为了避免一些问题:
- 线上新代码被旧代码覆盖:多人同时开发项目,都需要更新到测试机,如果不是统一
push
到test
分支做持续集成构建,很难保证线上新代码不会被旧代码覆盖 - 未测试的代码被更新到产品环境:这个问题也需要注意,因为这个问题并不能从流程上完全杜绝,需要各位在开发中留意
对于像下面这种特点的项目,可以根据情况调整、简化流程:
- 多页面 web 前端应用,把某一个页面更新到服务器并不影响其他页面
- NodeJs、PHP、Python 等后端应用,只上传自己更新的文件,而不影响服务器上其他文件(把所有代码打包成一个整体的方式除外)
- 使用本地构建的方式更新代码到服务器
比如:
master
:主分支man1
:个人man1
开发分支man2
:个人man2
开发分支task1
:需求task1
开发分支task2
:需求task2
开发分支
使用流程:
如果多个需求没有冲突,可以同时在 man1
个人分支上开发,并根据需要上传到不同的服务器。
如果多个需求有冲突,可以每个需求都新建一个分支,如上图所示:
- 提交代码到本地
task1
分支(以task1
个人为例) - 根据需要上传到不同的服务器
- 如果代码通过产品环境后,更新到每个个人分支,并删除
task1
分支
利用git 进行多人协作开发的更多相关文章
- 图文详解如何利用Git+Github进行团队协作开发
团队协作开发中,大部分都会用到版本控制软件,比如Git.Svn等.本文将通过一个实例,详细讲解在真实的工作环境中,一个团队应该如何利用Git+Github进行协作开发,即详解Git工作流程.并就其中比 ...
- Git详细教程---多人协作开发
Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...
- Git详细教程(2)---多人协作开发
Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...
- Git 多人协作开发的过程
Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...
- Git教程Git多人协作开发
Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...
- 利用Team@OSC进行团队协作开发平台
利用Team@OSC进行团队协作开发平台 Team@OSC介绍 Team@OSC 是一个团队协作开发平台,轻松管理轻量级团队.代码运行平台(PaaS).代码质量检查应有尽有. 链接:https://t ...
- 版本控制git之三-多人协作 变基 推送 拉取 删除远程分支
版本控制git之三-多人协作 wangfeng7399已关注0人评论350人阅读2019-02-20 21:33:08 如果你想获得一份已经存在了的 Git 仓库的拷贝,比如说,你想为某个开源 ...
- Unity3D多人协作开发环境搭建
多人协作 说到多人协作开发,大家都会想到要使用版本控制工具来管理项目,当然最常用的要数SVN和Git了,但是SVN管理Unity3D项目的确有一些不尽人意的地方. 比如:两个人修改了同一个场景,SVN ...
- GitHub 多人协作开发 三种方式:
GitHub 多人协作开发 三种方式: 一.Fork 方式 网上介绍比较多的方式(比较大型的开源项目,比如cocos2d-x) 开发者 fork 自己生成一个独立的分支,跟主分支完全独立,pull代码 ...
随机推荐
- os模块、os.path模块、shutil模块、configparser模块、subprocess模块
一.os模块 os指的是操作系统 该模块主要用于处理与操作系统相关的操作,常用的是文件操作(读.写.删.复制.重命名). os.getcwd() 获取当前文件所在的文件夹路径 os.chdir() ...
- java里的基本数据类型和引用数据类型
一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...
- MySQL(五)
关系 创建成绩表scores,结构如下 id 学生 科目 成绩 思考:学生列应该存什么信息呢? 答:学生列的数据不是在这里新建的,而应该从学生表引用过来,关系也是一条数据:根据范式要求应该存储学生的编 ...
- 单调队列以及单调队列优化DP
单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...
- python实现23种设计模式
本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python 参考文献: <大话设计模式>——吴强 <Py ...
- 使用JfreeChart生成图表遇到的问题
生成的图片不显示 需要在web.xml中配置一个指定的Servlet <servlet> <servlet-name>DisplayChart</servlet-name ...
- hdu1003 Max Sum(最大子串)
https://vjudge.net/problem/HDU-1003 注意考虑如果全为负的情况,特判. 还有输出格式,最后一个输出不用再空行. #include<iostream> #i ...
- 4、css属性操作
前面说的主要是css的使用规则和选择器等,这篇主要讲解css的具体使用. 本篇导航: css text 背景属性 边框属性 列表属性 dispaly属性 外边距(margine)和内边距(paddin ...
- .NET轻量级ORM框架Dapper入门精通
一.课程介绍 本次分享课程包含两个部分<.NET轻量级ORM框架Dapper修炼手册>和<.NET轻量级ORM框架Dapper葵花宝典>,阿笨将带领大家一起领略轻量级ORM框架 ...
- .Net转Java.02.数据类型
.NET中常见的数据类型分类分别是值类型和引用类型 值类型包括(基元类型.struct.枚举) 引用类型包括(类.类.数组.接口.指针) Java分为,基本类型和类 C# Java 值类型 ...