前言

不懂git工作流,被辞退了!

之前在看到这句话的时候,我刚实习入职不久,瑟瑟发抖。好巧不巧,今天又看到了类似的文章讲git重要性的。

眼下,学校导师安排给我的课题组了一个新的工程项目,使用gitee维护,因此我打算写一篇文章总结一下git的工作流(git工作流就是指单人/多人团队如何使用git命令配合维护一个项目的一些约定的流程,在确保有效迭代的同时,保持高效的协作方式),相信可以帮助那些使用git停留在单人维护远程master分支的同学更进一步。

下面会讲解四种git工作流中的前两种,无论是在校课题组还是公司内部,都可以以此为基础找到合适的git团队工作模式。

Centralized Workflow 集中式工作流

介绍

三个开发人员共同维护一份远程仓库的代码,工作方式如下:

  1. 每次工作前从remote拉取master分支到本地的master分支,然后处理冲突(使用IDE自带的GUI图形用户界面处理冲突会比较方便,如图中的goland内置的git工具)

  2. 接着开始编码,编码完成后add修改的文件到缓冲区

  3. commit缓冲区文件到自己local仓库,并且push本地仓库文件到remote仓库

评价

集中式工作流:这种工作方式简单粗暴,所有人只使用master分支维护项目,master永远是项目最新版本,编码比较快,立竿见影。但是所有开发者提交日志集中在一起呈单线延伸,难以定位问题,分工不明确,且容易发生冲突,处理冲突成本上升,但是单人开发很便利。

Feature Branch Workflow 功能分支工作流

介绍

功能分支工作流以集中式工作流为基础,在维护master分支的基础上,将项目的开发工作拆分为添加一个个的feature的形式,工作方式如下:

  1. 一旦需要开发新的功能,就在remotemaster分支的基础上创建一个feature xxx分支

  2. 本地创建对应的feature xxx分支

  3. 每次开发前将remote库feature xxx分支拉取到本地,处理冲突

  4. 然后在本地feature xxx分支上开发,然后push到remote的feature xxx分支

  5. 在项目主页上发起pull request(如果是gitlab则是merge request,作用相同),本意是提出将feature xxx分支合并入master分支的请求

  6. 然后你的代码会被review,没通过就本地改,改完之后继续pushremote(两头都在feature xxx分支),然后负责人继续review你这个PR或者MR,通过之后会将feature xxx分支区别于master的改动合并入master,删除remote的feature xxx分支,代表这个功能开发完毕

评价

功能分支工作流:这种工作方式带来了code review的功能,使得推送的代码更符合规范,减少bug产生。并且因为主要还是在master分支基础上根据功能需求创建feature分支,使得开发工作十分灵活,且各个功能之间隔离,但是对于大型项目而言需要为不同分支分配更加具体的角色,只有feature分支是不够的

Gitflow Workflow

介绍

Gitflow工作流是我目前尚在熟悉的一种工作流,也是目前非常成熟的git工作流方案。区别于功能分支工作流,Gitflow工作流划分分支更有约束性。主要包括:

  1. 主分支master:用于跟踪项目正式发布的版本(tag标签号)
  2. 开发分支dev:用于跟踪代码研发的提交历史
  3. 功能研发分支feature:每次有新的功能需要研发,以dev分支为基础,建立feature分支,开发完成后按上面feature branch工作流的方式提交PR/MR到remote的dev分支,完成之后删除对应feature分支
  4. 热修复分支hotfix:如上图所示,master分支出现bug(线上报bug了),需要马上从master拉取一个hotfix分支处理修复bug,并且将代码合并到master和dev(这两个分支需要保持bug修复的一致性),修复后给master当前提交打一个tag(v0.2)
  5. 发布分支release:在dev基础上建立release分支,处理一些问题、修复一些bug之后,将代码合并入master与dev,并给master打上tag(v1.0)表示发布完成

评价

约束性更强,发布迭代流程更规范,严谨,开发人员分工更明确,十分推荐学习使用。

Forking Workflow

介绍

这种工作流是开源项目维护的工作流,暂作了解即可,通过将他人的项目fork到自己的remote仓库,就可以将其作为自己拥有的一份副本进行开发,比如想增加一个功能或者修复一个bug。这里A与C都fork了B的仓库,在各自开发完成新功能之后可以提交PR给B仓库,B仓库的开发者负责review代码,并接受PR。

评价

具体还未尝试过提交PR给开源项目,但是相信在掌握了上述三个git工作流之后,以后要使用到forking工作流的问题也应该引刃而解。

结束

学习了四种git工作流之后,并不是要完全照搬某一个模式的所有使用流程,而是应该结合实际的项目规模和人员规模进行合理安排。比如对于校内课题组较小的项目我认为feature branch工作流应该足以胜任,或者使用只有masterdevfeature的简化版Gitflow工作流

我是白泽,一个有点逗比的程序员/学生党,咱们下期见。

欢迎大家关注公众号【程序员白泽】。

传送门

刚建了个微信小群,欢迎一起交流学习,备战秋招。

传送门

刚进公司,不懂GIt工作流的我瑟瑟发抖的更多相关文章

  1. PHP新手必学之刚进公司装环境

    由于今天去一家公司做项目,又重新的装了一遍所熟悉的PHP环境,所以记录下来,总结下. PHP环境主要: PHPstudy(apache+mysql+php)+phpstorm+navicate 解释: ...

  2. 开发环境之git:团队协作git工作流与常用命令

    此篇文章只是一篇傻瓜式的,记录工作中比较规范且常见的一个git工作流需要用到的命令,让你可以快速的开始工作.而不是一些长篇大论的理论知识,如果你有用过sourcetree或者其它图形化工具,结合你正在 ...

  3. Git工作流总结

    引用自:https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md 说明: 个人在学习Git工作流的过程中,从原有的 S ...

  4. [转]深入理解学习GIT工作流

    深入理解学习Git工作流 字数13437 阅读2761 评论3 喜欢70 个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心 ...

  5. 深入理解学习Git工作流(转)

    个人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协作模式,直到有一天我看到了下面的文章,好多遗留在心中的困惑迎刃而解,于是我将这部分资料进行整理放到了github上,欢迎st ...

  6. 深入理解学习Git工作流(git-workflow-tutorial)

    转载:https://segmentfault.com/a/1190000002918123#articleHeader11 人在学习git工作流的过程中,从原有的 SVN 模式很难完全理解git的协 ...

  7. 深入学习 Git 工作流

    原文  https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md   个人在学习git工作流的过程中,从原有的 SVN ...

  8. git 工作流介绍

    GIT Git工作流你可以理解为工作中团队成员遵守的一种代码管理方案,在Git中有以下几种工作流方案作为方案指导: 集中式工作流 功能开发工作流 Gitflow工作流 Forking工作流 下面针对性 ...

  9. Git 工作流的正确打开方式

    前言 一直在使用git做版本控制,也一直工作很顺利,直到和别人发生冲突的时候.这才注意到git 工作流并不是那么简单.比如,之前遇到的清理历史.百度到的资料很多,重复性也很多,但实践性操作很少,我很难 ...

随机推荐

  1. CF1166A Silent Classroom 题解

    Content 现在有 \(n\) 名学生,我们需要将这些学生分到两个班上.对于两名在同一班级的学生,如果他们的名字首字母相同,他们就会聊天. 现在给定这些学生的名字,问最少有多少对学生会在一起聊天. ...

  2. TFTP协议介绍-python实现tftp客户端

    1. TFTP协议介绍 TFTP(Trivial File Transfer Protocol,简单文件传输协议) 是TCP/IP协议族中的一个用来在客户端与服务器之间进行简单文件传输的协议 特点: ...

  3. 阿里巴巴分布式服务框架HSF

    HSF称之为高速服务框架HSF(High-speed Service Framework),是在阿里巴巴广泛使用的分布式RPC服务框架. HSF连通不同的业务系统,解耦系统间的实现依赖.HSF从分布式 ...

  4. react 实现tab切换 三角形筛选样式

    ​ ​ 这次使用的是react的class 类组件 import React, { Component } from 'react' import { LeftOutline, SearchOutli ...

  5. 【LeetCode】191. Number of 1 Bits 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 右移32次 计算末尾的1的个数 转成二进制统计1的个 ...

  6. Polyomino Composer(UVA12291)

    Description   Polyomino Composer  A polyomino is a plane geometric figure formed by joining one or m ...

  7. 教学日志:javaSE-java中的数据类型和运算符

    一.java中的标识符 /* 标识符的命名规范: 硬性要求: 1.必须以字母._下划线.美元符$开头 2.其它部分可以是字母.下划线"_".美元符"$"和数字的 ...

  8. Now冥想:崩溃服务和性能服务助力提升应用质量

    想就像心灵的"健身房",当遇到失眠或情绪问题时,我们可以通过冥想,抚平情绪波澜,享受放松时刻.<Now冥想>正是一款专注冥想与心理健康的应用.它基于国际先进的正念冥想理 ...

  9. 业务层面和运维层面优化你的Redis

    业务层面 key的长度尽量要短,在数据量非常大时,过长的key名会占用更多的内存; 一定避免存储过大的数据(大value),过大的数据在分配内存和释放内存时耗时严重,会阻塞主线程; Redis 4.0 ...

  10. Wiener Filtering

    目录 基本 滤波的推导 特别的情况 特别的例子 Signals, Systems and Inference, Chapter 11: Wiener Filtering (mit.edu) 基本 在图 ...