如何高效实用 Git

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 request 和 git 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/friendrequest 到 release/fb。
2)因为 release branch 已经有了 Alice 提交的登录代码,所以代码冲突就发生了。你作为技术leader,有责任去解决冲突,然后合并分支。
3)现在 John 开发完了,因为 John 开发经验比 Alice 和 Bob 都丰富,John 自己处理了代码冲突。John 从 release/fb 拿到最新的代码放到自己的 feature/newsfeed (通过 git pull 或 git 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的更多相关文章
- 实用git指令
实用git指令 clone 操作目的 简要操作说明 详细操作说明 init & add & commit & push 操作目的 简要操作说明 详细操作说明 pull & ...
- 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- Sublime Text 3高效实用快捷键
2017-11-27 16:18:48 Sublime Text 3 高效实用快捷键 Sublime Text 3 软件及注册码 官网下载链接在这里,有时候会很神奇的上不去,可能是因为被Q了,可能就是 ...
- 如何高效撤销Git管理的文件在各种状态下的更改
一.背景 企业中我们一般采用分布式版本管理工具git来进行版本管理,在团队协作的过程中,我们难免会遇到误操作,需要撤销更改的情况,那么我们怎么高效的进行撤销修改呢?对于还未提交到暂存区的代码怎么高效撤 ...
- 高效使用git的一些命令
1,添加文件到版本库 添加单个文件: git add filename 添加所有txt文件: git add *.txt 添加所有修改文件: git add ...
- Intelligent idea高效实用总结
一直使用eclipse,最近才转到idea IDE上面来,的确从效率等多个角度,idea都要优于eclipse.由于刚实用idea,不是很熟练,将常用的技巧总结集锦一下,方便以后查看,慢慢积累吧 一. ...
- 高效实用的.NET开源项目
似乎...很久很久没有写博客了,一直都想写两篇,但是却没有时间写.感觉最近有很多事情需要处理,一直都是疲于奔命,一直到最近才变得有些时间学习和充电.最近没有事情都会看一些博客和开源项目,发现介绍开源项 ...
- Visual Studio高效实用的扩展工具、插件
说明: 对一个有想法的程序员来说,善于使用一款高效的开发工具是很重要的,今天给大家介绍的是宇宙第一IDE vs用起来很不错的开发工具,假如大家觉得不错也可以尝试的用用,毕竟对于我们这些一天一大半的时间 ...
随机推荐
- Java中try catch finally执行
直接上代码实例: public static void main(String[] args) { System.out.println(test1()); } static int test1 ...
- 2019.12.15 QLU and SNDU期末联赛
题目列表: 1582.柳予欣的舔狗行为 1587.柳予欣的女朋友们在分享水果 1585.柳予欣和她女朋友的购物计划 1579.FFFFFunctions 1588.Zeckendorf 1586.柳予 ...
- WPF 一个性能比较好的 gif 解析库
本文介绍 Magick.NET ,这是 ImageMagick 的 .Net 封装,他支持 100 多种格式的图片,而 gif 也是他支持的.本文告诉大家如何使用这个库播放 gif 图 先给大家看一下 ...
- 2018 CCPC 吉林站 H Lovers
2018 CCPC 吉林站 H Lovers 传送门:https://www.spoj.com/problems/LIS2/en/ 题意: q次操作 1.将第l~r个数的左边和和右边都加上一个数d, ...
- 今天IT告告诉我,我电脑上的java jdk属性收费滴!需卸载
敲着代码,IT突然跑来说,你电脑的Jdk版本属于收费版,目前需要卸载!啊哦...手贱!每次有更新我都更新了,Java要收费老早之前耳闻了,但是俺很少做java,一般都在.Net,所以忽略鸟.. 于是G ...
- Delphi中的Val函数和iif函数(出错的时候,会有索引值)
在delphi中Val是一个将字符串转换为数字的函数,Val(S; var V; var Code: Integer)第一个参数是要转换的字符串,第二个参数存放转换后的数字,可以是整数或浮点数,第三个 ...
- 无法加载文件C:\Users\TANG\AppData\Roaming\npm\nrm.ps1,因为在此系统上禁止运行脚本
# 碰到问题解决过程 > 1. 刚在一个新的机器上装node环境时,要用一个nrm管理镜像源时.报了一个错,如图1 ![图1](https://img2018.cnblogs.com/blog/ ...
- TCP/IP||Ping
1.what's PING 由Mike Muuss编写,为了测试另一台主机是否可达,发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答,如果不能PING到某台主机,那么就不能Telnet或 ...
- ELK学习实验003:Elasticsearch 集群安装
前面已经介绍了Elasticsearch这个工具,并对单机安装做了简单介绍,现在使用三台机器做一个elasticsearch集群 一 环境准备 1.1 机器准备 1.2 同步时间 [root@node ...
- 017 Ceph的集群管理_3
一.验证OSD 1.1 osd状态 运行状态有:up,in,out,down 正常状态的OSD为up且in 当OSD故障时,守护进程offline,在5分钟内,集群仍会将其标记为up和in,这是为了防 ...