Git 工作流

只要项目是多人参与的,那么就需要使用正确的 Git 工作流程。

下面介绍一个简单有效的工作流程。

场景

假设有一个项目,要开发下一代的 Facebook,你就是这个项目的技术 leader,你的团队有3个开发人员:

  • Alice:1年开发经验
  • Bob:1年开发经验
  • John:3年开发经验
  • You:这个项目的技术 leader

Git 中的开发过程

Master branch 主分支

1)主分支始终包含线上产品的代码。

2)任何人,包括技术 leader,都不允许直接修改主分支上的代码,因为主分支是线上代码的拷贝。

3)代码的开发是在其他分支上做的。

Release branch 发布分支

1)项目启动后,首先要为项目创建一个 Release branch,是从 Master branch 创建出来的。

2)关于项目的所有代码都会在这个 Release branch 中,这个 Release branch 也只是一个普通的分支,只是以 “release/” 开头。

3)例如把我们这个项目的 Release branch 命名为 “release/fb”。

4)可能同时会有多个项目在开发,所以,为每个项目创建一个独立的 Release branch,例如现在还有一个项目叫 “release/messenger”。

5)使用 Release branch 的目的就是多个项目间不影响。

Feature branch 特征分支

1)开发每个功能时都创建一个 Feature branch,确保这个功能是单独开发的。

2)Feature branch 是以 “feature/” 为前缀名的普通分支。

3)你作为技术leader,现在让 Alice 去开发登录功能,所以 Alice 创建了一个新的 Feature branch,叫做 “feature/login”,然后在这个分支中开发登录功能。

4)Feature branch 通常是从 Release branch 中创建出来的。

5)你让 Bob 开发加好友的功能,Bob 就创建了一个 Feature branch,命名为 “feature/friendrequest”。

6)John 的任务是创建新闻 feed 流,他创建了 “feature/newsfeed”。

7)每个程序员都在自己的 Feature branch 中进行开发。

8)现在,Alice 的登录功能开发完了,需要把自己 feature/login 分支中的代码发到 release/fb 中,可以通过 pull request

pull request

首先,不要把 pull requestgit pull 混淆了。

开发人员不能直接把自己分支中的代码推到 release branch 中。

技术 leader 先要做个 review,检查一下代码。

这就是通过 pull request 做的。

例如 GitHub 中的操作流程:

点击 “New pull request” 后:

  • compare 是 Alice 自己的 feature/login 开发分支。
  • base 是项目的 release/fb 发布分支。

之后,Alice 输入一个标题和描述,最后点击 “Create Pull Request”。

Alice 需要为这个 pull request 分配一个 reviewer,就是你。

然后你就可以对 pull request 的代码进行 review 了,没问题后就可以把 feature/login 合并到 release/fb 了,此时 Alice 这个功能的代码就算成功提交了。

代码冲突

1)Bob 开发完了,也发起了一个 pull request,从 feature/friendrequestrelease/fb

2)因为 release branch 已经有了 Alice 提交的登录代码,所以代码冲突就发生了。你作为技术leader,有责任去解决冲突,然后合并分支。

3)现在 John 开发完了,因为 John 开发经验比 Alice 和 Bob 都丰富,John 自己处理了代码冲突。John 从 release/fb 拿到最新的代码放到自己的 feature/newsfeed (通过 git pullgit merge),并处理了所有的冲突。

4)John 发起了一个 pull request,这时你就省心了,不用你来解决代码冲突了。

所以,解决代码冲突的2个途径:

  • 负责 pull request review 的人来处理。
  • 开发人员自己处理,把最新的 release branch 合并到自己的 feature branch,解决掉所有代码冲突。

回到 Master branch

项目开发完成后,release 分支合并回 master 分支。

翻译整理自:

https://medium.com/free-code-camp/how-to-use-git-efficiently-54320a236369

推荐阅读:

如何高效实用 Git的更多相关文章

  1. 实用git指令

    实用git指令 clone 操作目的 简要操作说明 详细操作说明 init & add & commit & push 操作目的 简要操作说明 详细操作说明 pull & ...

  2. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  3. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  4. Sublime Text 3高效实用快捷键

    2017-11-27 16:18:48 Sublime Text 3 高效实用快捷键 Sublime Text 3 软件及注册码 官网下载链接在这里,有时候会很神奇的上不去,可能是因为被Q了,可能就是 ...

  5. 如何高效撤销Git管理的文件在各种状态下的更改

    一.背景 企业中我们一般采用分布式版本管理工具git来进行版本管理,在团队协作的过程中,我们难免会遇到误操作,需要撤销更改的情况,那么我们怎么高效的进行撤销修改呢?对于还未提交到暂存区的代码怎么高效撤 ...

  6. 高效使用git的一些命令

    1,添加文件到版本库        添加单个文件: git add filename        添加所有txt文件: git add *.txt        添加所有修改文件: git add ...

  7. Intelligent idea高效实用总结

    一直使用eclipse,最近才转到idea IDE上面来,的确从效率等多个角度,idea都要优于eclipse.由于刚实用idea,不是很熟练,将常用的技巧总结集锦一下,方便以后查看,慢慢积累吧 一. ...

  8. 高效实用的.NET开源项目

    似乎...很久很久没有写博客了,一直都想写两篇,但是却没有时间写.感觉最近有很多事情需要处理,一直都是疲于奔命,一直到最近才变得有些时间学习和充电.最近没有事情都会看一些博客和开源项目,发现介绍开源项 ...

  9. Visual Studio高效实用的扩展工具、插件

    说明: 对一个有想法的程序员来说,善于使用一款高效的开发工具是很重要的,今天给大家介绍的是宇宙第一IDE vs用起来很不错的开发工具,假如大家觉得不错也可以尝试的用用,毕竟对于我们这些一天一大半的时间 ...

随机推荐

  1. CSS 高度居中方案

    实现高度自适应并且上下居中 <div id="wrap"> <div class="box">DemoSeat</div> ...

  2. destoon自定义文件的伪静态地址优化

    destoon自定义文件的伪静态优化 destoon给出了一个自定义文件传参的方式 在/include/global.func.php 有个rewirte函数来处理 目前的处理方式:index.php ...

  3. Servlet 常用类

    Servlet 是一套标准的接口规范,当用户通过web请求来访问服务器时,由web容器根据配置调用我们实现的对应的servlet对象来提供服务.同时为了方便开发,servlet标准中也提供了许多常用的 ...

  4. SRTE测试

    网络拓扑: XRV1 ======================================================================= hostname XRV1expl ...

  5. 利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。

    正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的‘好’东西记 ...

  6. boostrap-非常好用但是容易让人忽略的地方【6】:role属性

    普通样式,鼠标hover没有任何效果 <span>content</span> 加上role属性的样式,鼠标hover会有cursor:pointer的效果 <span ...

  7. 浅解 go 语言的 interface(许的博客)

    我写了一个 go interface 相关的代码转换为 C 代码的样例.也许有助于大家理解 go 的 interface.不过请注意一点,这里没有完整解析 go 语言 interface 的所有细节. ...

  8. 适配器模式 iOS

    前言: 最近需求作一个公共空间的需求,最后决定用适配器模式来做. 首先,需求是什么? 在我们app中,会有很多列表,tableviewcell的样式会比较统一(当然,我之前在公司那个app不算很大,基 ...

  9. 缓存一致性协议(MESI)

    在目前主流的计算机中,cpu执行计算的主要流程如图所示: 数据加载的流程如下: 1.将程序和数据从硬盘加载到内存中 2.将程序和数据从内存加载到缓存中(目前多三级缓存,数据加载顺序:L3->L2 ...

  10. maven parent 与 import 的区别

    在 maven 配置文件 pom.xml 中可以 引入 <parent>,方式如下(举例是 spring-boot-starter-parent 中的继承关系)   <parent& ...