当前位置: 首页 > news >正文

如何高效的使用 Git

代码昨天还是运行好好的今天就不行了。

代码被删了。

突然出现了一个奇怪的 bug,但是没人知道怎么回事。

如果你出现过上面的任何一种情况,那本篇文章就是为你准备的。

除了知道 git add、git commit、git push 之外,Git 中还需要其他重要的技术需要掌握。长远来看对我们是有帮助的。这里我将向你展示 Git 的最佳实践。

Git 工作流

当有多个开发者同时涉及到一个项目时那么就非常有必要正确使用 Git 工作流。这里我将介绍一种工作流,它在一个多人大型项目中将非常有用。

f07ce72d90087e865dc8930b78129c040711e4a0

前言

突然有一天,你成为了一个项目的技术 Leader 并计划做出下一个 Facebook。在这个项目中你有三个开发人员:

Alice:一个开发小白

Bob:拥有一年工作经验,了解基本开发

John:三年开发经验,熟练开发技能

你:该项目的技术负责人

Git 开发流程

Master 分支

Master 分支应该始终和生产环境保持一致。

由于 master 和生产代码是一致的,所以没有人包括技术负责人能在 master 上直接开发。

真正的开发代码应当写在其他分支上。

Release(发布)分支

当项目开始时,第一件事情就是创建发布分支。发布分支是基于 master 分支创建而来。

所有与本项目相关的代码都在发布分支中,这个分支也是一个以 release/ 开头的普通分支。

比如这次的发布分支名为 release/fb。

可能有多个项目都基于同一份代码运行,因此对于每一个项目来说都需要创建一个独立的发布分支。假设现在还有一个项目正在并行运行,那就得为这个项目创建一个单独的发布分支比如 release/messenger。

需要单独的发布分支的原因是:多个并行项目是基于同一份代码运行的,但是项目之间不能有冲突。

Feature(功能分支)branch

对于应用中的每一个功能都应该创建一个独立的功能分支,这会确保这些功能能被单独构建。

功能分支也和其他分支一样,只是以 feature/ 开头。

现在作为技术 Leader,你要求 Alice 去做 Facebook 的登录页面。因此他创建了一个新的功能分支。把他命名为 feature/login。Alice 将会在这个分支上编写所有的登录代码。

这个功能分支通常是基于 Release(发布)分支 创建而来。

Bob 的任务为创建添加好友页面,因此他创建了一个名为 feature/friendrequest的功能分支。

John 则被安排构建消息流,因此创建了一个 feature/newsfeed 的功能分支。

所有的开发人员都在自己的分支上进行开发,目前为止都很正常。 8.现在当 Alice 完成了他的登录开发,他需要将他的功能分支 feature/login 发送给 Release(发布)分支。这个过程是通过发起一个 pull request 完成的。

Pull request

首先 pull request 不能和 git pull 搞混了。

开发人员不能直接向 Release发(布)分支推送代码,技术 Leader 需要在功能分支合并到 Release(发布)分支之前做好代码审查。这也是通过 pull request 完成的。

Alice 能够按照如下 GitHub 方式提交 pull request。

9bb7dd61dea48325889b8d5055887b4ff60a76e4

在分支名字的旁边有一个 “New pull request” 按钮,点击之后将会显示如下界面:

a673a3572c8e2b41e74064039218b13f66f50804

比较分支是 Alice 的功能分支 feature/login。

base 分支则应该是发布分支 release/fb。

点击之后 Alice 需要为这个 pull request 输入名称和描述,最后再点击 “Create Pull Request” 按钮。

同时 Alice 需要为这个 pull request 指定一个 reviewer。作为技术 Leader 的你被选为本次 pull request 的 reviewer。

你完成代码审查之后就需要把这个功能分支合并到 Release(发布)分支。

现在你已经把 feature/login 分支合并到 release/fb,并且 Alice 非常高兴他的代码被合并了。

代码冲突

Bob 完成了他的编码工作,同时向 release/fb 分支发起了一个 pull request。

因为发布分支已经合并了登录的代码,这时代码冲突发生了。解决冲突和合并代码是 reviewer 的责任。在这样的情况下,作为技术 Leader 就需要解决冲突和合并代码了。

现在 John 也已经完成了他的开发,同时也想把代码合并到发布分支。但 John 非常擅长于解决代码冲突。他将 release/fb 上最新的代码合并到他自己的功能分支 feature/newsfeed (通过 git pull 或 git merge 命令)。同时他解决了所有存在的冲突,现在 feature/newsfeed 已经有了所有发布分支 release/fb 的代码。

最后 John 创建了一个 pull request,由于 John 已经解决了所有问题,所以本次 pull request 不会再有冲突了。

因此通常有两种方式来解决代码冲突:

pull request 的 reviewer 需要解决所有的代码冲突。

开发人员需要确保将发布分支的最新代码合并到功能分支,并且解决所有的冲突。

还是 Master 分支

一旦项目完成,发布分支的代码需要合并回 master 分支,同时需要发布到生产环境。因此生产环境中的代码总是和 master 分支保持一致。同时对于今后的任何项目来说都是要确保 master 代码是最新的。

原文发布时间为:2018-11-13

原文作者:良许Linux

本文来自云栖社区合作伙伴“良许Linux”,了解相关信息可以关注“良许Linux”。

相关文章:

  • opencv模板匹配有趣的链接
  • 好看的字体—方正粗倩
  • PAT 1041 Be Unique[简单]
  • 创建Cloudhbase维表
  • 新项目流程--安装yii框架
  • 我写的Angular相关的文章
  • 给Python新人练手准备的两个简单案例
  • js中的 substr方法与substring方法 不同
  • 程序猿生存指南-13 再见老潘
  • 小程序获取unionId以及手机号
  • 一道小编程题(自用)
  • eclipse中类和方法添加作者日期说明
  • Mongodb网页图形化管理工具,基于Spring Boot2.0,前端采用layerUI实现
  • 【小坑】awvs安装出现:database service cannot be started错误
  • 离散傅里叶级数的最高频率和频率分辨率
  • [Vue CLI 3] 配置解析之 css.extract
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • eclipse的离线汉化
  • es6
  • js继承的实现方法
  • mac修复ab及siege安装
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Theano - 导数
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 阿里云应用高可用服务公测发布
  • 记一次删除Git记录中的大文件的过程
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端工程化(Gulp、Webpack)-webpack
  • 使用 Docker 部署 Spring Boot项目
  • 微信支付JSAPI,实测!终极方案
  • Mac 上flink的安装与启动
  • scrapy中间件源码分析及常用中间件大全
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​如何在iOS手机上查看应用日志
  • #每日一题合集#牛客JZ23-JZ33
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (11)MSP430F5529 定时器B
  • (三)mysql_MYSQL(三)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转) Android中ViewStub组件使用
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net下的富文本编辑器FCKeditor的配置方法
  • ?php echo ?,?php echo Hello world!;?
  • @media screen 针对不同移动设备
  • @我的前任是个极品 微博分析
  • [ARM]ldr 和 adr 伪指令的区别
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [C++]四种方式求解最大子序列求和问题
  • [codeforces]Recover the String
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [IDF]被改错的密码
  • [java基础揉碎]方法的重写/覆盖
  • [LeetCode]: 145: Binary Tree Postorder Traversal
  • [NOIP 2015]Day.1 T2 信息传递 【最小环】