深入理解 GitHub Flow
GitHub Flow 是一个轻量级,基于分支的工作流,支持团队和项目的定期部署。本指南介绍了 GitHub Flow 的工作原理。
Step 1. 创建分支(Create a branch)
当你操作一个项目的时候,无论其他协作者做什么,你都可以在特定的分支上实现自己的想法。也就是说,分支的存在是帮助你管理这些工作流。
在你创建了一个项目的分支的时候,你也就创建了一个可以尝试你的新想法的环境。在分支上做的更改不会影响master
分支,所以你可以自由地进行实验和提交更改,这些操作都是安全的。当然,只有你完成的代码被协作人审阅并通过的时候,才可以被合并。
提示(ProTip)
分支是 Git 中的核心概念,而且整个 GitHub Flow 也是基于此的。在这里,只有一条规则,那就是:master
分支中任何内容都是可以被展开的。
正因为如此,新分支在实现一个功能或修复一个程序的时候是非常重要的。你的分支名称应该具有描述性(例如,refactor-authentication
、user-content-cache-key
、make-retina-avatars
),以便其他人通过分支名称就可以知道它到底是干什么用的。
Step 2. 添加提交(Add commit)
只要你创建了分支,就说明你要对它进行修改啦!无论添加、修改、还是删除文件,你都必须进行提交,将它们同步到你的分支上。当你在分支上工作的时候,这些提交操作可以跟踪你的工作进度。
提交操作也建立一个关于你工作的透明历史,通过查看这些提交记录,其他人可以知道你做了什么和为什么这么做。每个提交操作都有一个相关的提交信息(Commit messages),用于描述你做出的修改。此外, 每一个提交操作都被视为一个“修改单元”。如果发现了 bug 或者决定走不同的开发方向,你也可以通过这些“修改单元”进行回滚操作。
提示(ProTip)
提交信息非常的重要,特别是当你将修改的内容提交到服务器之后,Git 可以追踪到你的修改内容并展示它们。通过写清楚的提交信息,你可以让其他人更容易跟上我们的思路并提供反馈。
Step 3. 提出 Pull 请求(Open a pull request)
Pull 请求开启了一个关于你的提交内容的讨论。因为他们与底层 Git 仓库紧密集成,所以如果他们接受你的请求,任何人都可以准确地看到合并的变化。
你可以在开发过程中的任何时候提出一个 Pull 请求:当你有很少或没有代码但想分享一些截图或一些想法的时候;当你卡住了需要帮助或建议的时候;或者当你准备好了让人来审查你工作的时候。在你写 Pull 请求信息的时候,通过使用 GitHub 的@mention system
,你可以向特定的人或团队反馈问题,无论他们在你身边还是在 10 个时区之外。
提示(ProTip)
Pull 请求对于促进开源项目和管理共享库的更改非常有用。如果你使用Fork & Pull Model
,Pull 请求提供一种方式来通知工程维护人员关于你希望他们考虑的变化。如果使用Shared Repository Model
,则在将它们合并到主分支前,Pull 请求帮助启动代码审查和有关更改建议的会话。
Step 4. 讨论和评估你的代码(Discuss and review your code)
当你提出 Pull 请求的时候,审查你的更改内容的人或团队可能有一些问题或者意见。也许你的编码风格与项目规范不符,或者缺少单元测试,也有可能所有的东西看起来都很棒,条理清晰。Pull 请求的目的就是鼓励和捕捉这种类型的对话。
你也可以在大家讨论和给出关于你提交内容的反馈时,继续 Push 你的分支。如果有人评论说你什么没有做,或者代码中有 bug,你也可以及时把它修复,然后 Push 这些修改。GitHub 将会给你展示出最新评论和反馈,你也可以在 Pull 请求的视图中统一接收这些消息。
提示(ProTip)
Pull 请求的评论是用 Markdown 编辑的,因此你可以在评论中嵌入图片、表情符号、使用预格式化文本块,以及其他轻量级的格式。
Step 5. 部署(Deploy)
只要你的 Pull 请求被审查并且通过了你的测试,你就可以部署这些修改,在生产环境中验证她们。如果分支发生了问题,你也可以回滚到之前的状态。
Step 6. 合并(Merge)
现在, 你修改的内容已经在生产环境中验证了,是时候将你的代码合并到master
分支啦!合并之后,Pull 请求就保存了一份关于你修改代码的历史记录。因为它们是可搜索的,所有任何人都可以通过搜索了解你为什么这么修改以及如何修改的。
提示(ProTip)
通过将某些关键字加入到你的 Pull 请求文本中,你可以将问题与代码关联起来。当你的 Pull 请求被合并时,相关问题也将被关闭。例如,输入短语Closes #32
,将关闭仓库中序号为 32 的问题。此外,可以通过我们的「帮助文章」,了解更多的信息,
最后,附上博主的 GitHub 账号,欢迎大家
Follow
:维C果糖
原文链接:Understanding the GitHub Flow
- Linux shell 程序设计2——bash的内置命令
- T-SQL Enhancement in SQL Server 2005[下篇]
- JS原型,a和b是不是失散多年的兄弟?
- Linux shell 程序设计1——安装及入门
- 偶遇--《坑新人--前端专用面试题》
- 简单的说下,(function(){...})() 与 (function(){...}()) 有什么区别?
- ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline[上篇]
- Shell常用命令小结
- 插入法排序
- ASP.NET Process Model之二:ASP.NET Http Runtime Pipeline - Part II
- 震惊了!这样的js面试题让所有人-男默女泪
- 前端知识学了却不会用,都是没走心
- var a="xx";a=a+"ss";a的值变了,但"xx"字符串并没有变
- 先行者计划--1109微课总结 | 《通过二个demo初识webPack》
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 专属于六倍体小麦的Bioconductor注释包
- 轻松上传超过100M的文件至GitHub
- 转录组分析 | 使用DESeq2进行基因差异表达分析
- 生信基础 | 使用BLAST进行序列比对
- 批量提取基因上下游指定范围内的SNP标记
- 一文掌握Plink文件格式转换
- R语言绘图 | 绘制QQ图和曼哈顿图
- GWAS | 使用GEMMA进行全基因组关联分析
- 使用eggnog-mapper进行功能注释
- 离线环境下使用Conda安装软件
- 利用cutree划分pheatmap聚类结果
- 使用Mfuzz进行转录组表达模式聚类分析
- 使用PopLDdecay快速进行连锁不平衡分析
- 报错坑 | LDSC安装报错怎么解决?
- 看看斯坦福大学是如何教学生编程的