Git - Pull Request工作流
Pull Requests
是Bitbucket
上方便开发者之间协作的功能。提供了一个用户友好的Web
界面,在集成提交的变更到正式项目前可以对变更进行讨论。
开发者向团队成员通知功能开发已经完成,Pull Requests
是最简单的用法。开发者完成功能开发后,通过Bitbucket
账号发起一个Pull Request
。这样让涉及这个功能的所有人知道,要去做Code Review
和合并到master
分支。
但是,Pull Request
远不止一个简单的通知,而是为讨论提交的功能的一个专门论坛。如果变更有任何问题,团队成员反馈在Pull Request
中,甚至push
新的提交微调功能。所有的这些活动都直接跟踪在Pull Request
中。
相比其它的协作模型,这种分享提交的形式有助于打造一个更流畅的工作流。SVN
和Git
都能通过一个简单的脚本收到通知邮件;但是,讨论变更时,开发者通常只能去回复邮件。这样做会变得杂乱,尤其还要涉及后面的几个提交时。Pull Requests
把所有相关功能整合到一个和Bitbucket
仓库界面集成的用户友好Web
界面中。
解析Pull Request
当要发起一个Pull Request
,你所要做的就是请求(Request
)另一个开发者(比如项目的维护者),来pull
你仓库中一个分支到他的仓库中。这意味着你要提供4个信息(源仓库、源分支、目的仓库、目的分支),以发起Pull Request
。
这些值多数Bitbucket
都会设置上合适的缺省值。但取决你用的协作工作流,你的团队可能会要指定不同的值。上图显示了一个Pull Request
请求合并一个功能分支到正式的master
分支上,但可以有多种不同的Pull Request
用法。
工作方式
Pull Request
可以和功能分支工作流、Gitflow
工作流或Forking
工作流一起使用。但Pull Request
要求要么分支不同,要么仓库不同,所以不能用于集中式工作流。在不同的工作流中使用Pull Request
会有一些不同,但基本的过程是这样的:
- 开发者在本地仓库中新建一个专门的分支开发功能。
- 开发者
push
分支修改到公开的Bitbucket
仓库中。 - 开发者通过
Bitbucket
发起一个Pull Request
。 - 团队的其它成员
review
code
,讨论并修改。 - 项目维护者合并功能到官方仓库中并关闭
Pull Request
。
本文后面内容说明,Pull Request
在不同协作工作流中如何应用。
在功能分支工作流中使用Pull Request
功能分支工作流用一个共享的Bitbucket
仓库来管理协作,开发者在专门的分支上开发功能。但不是立即合并到master
分支上,而是在合并到主代码库之前开发者应该开一个Pull Request
发起功能的讨论。
功能分支工作流只有一个公开的仓库,所以Pull Request
的目的仓库和源仓库总是同一个。通常开发者会指定他的功能分支作为源分支,master
分支作为目的分支。
收到Pull Request
后,项目维护者要决定如何做。如果功能没问题,就简单地合并到master
分支,关闭Pull Request
。但如果提交的变更有问题,他可以在Pull Request
中反馈。之后新加的提交也会评论之后接着显示出来。
在功能还没有完全开发完的时候,也可能发起一个Pull Request
。比如开发者在实现某个需求时碰到了麻烦,他可以发一个包含正在进行中工作的Pull Request
。其它的开发者可以在Pull Request
提供建议,或者甚至直接添加提交来解决问题。
在Gitflow
工作流中使用Pull Request
Gitflow
工作流和功能分支工作流类似,但围绕项目发布定义一个严格的分支模型。在Gitflow
工作流中使用Pull Request
让开发者在发布分支或是维护分支上工作时,可以有个方便的地方对关于发布分支或是维护分支的问题进行交流。
Gitflow
工作流中Pull Request
的使用过程和上一节中完全一致:当一个功能、发布或是热修复分支需要Review
时,开发者简单发起一个Pull Request
,团队的其它成员会通过Bitbucket
收到通知。
新功能一般合并到develop
分支,而发布和热修复则要同时合并到develop
分支和master
分支上。Pull Request
可能用做所有合并的正式管理。
在Forking
工作流中使用Pull Request
在Forking
工作流中,开发者push
完成的功能到他自己的仓库中,而不是共享仓库。然后,他发起一个Pull Request
,让项目维护者知道他的功能已经可以Review
了。
在这个工作流,Pull Request
的通知功能非常有用,因为项目维护者不可能知道其它开发者在他们自己的仓库添加了提交。
由于各个开发有自己的公开仓库,Pull Request
的源仓库和目标仓库不是同一个。源仓库是开发者的公开仓库,源分支是包含了修改的分支。如果开发者要合并修改到正式代码库中,那么目标仓库是正式仓库,目标分支是master
分支。
Pull Request
也可以用于正式项目之外的其它开发者之间的协作。比如,如果一个开发者和一个团队成员一起开发一个功能,他们可以发起一个Pull Request
,用团队成员的Bitbucket
仓库作为目标,而不是正式项目的仓库。然后使用相同的功能分支作为源和目标分支。
2个开发者之间可以在Pull Request
中讨论和开发功能。完成开发后,他们可以发起另一个Pull Request
,请求合并功能到正式的master
分支。在Forking
工作流中,这样的灵活性让Pull Request
成为一个强有力的协作工具。
示例
下面的示例演示了Pull Request
如何在在Forking
工作流中使用。也同样适用于小团队的开发协作和第三方开发者向开源项目的贡献。
在示例中,小红是个开发,小明是项目维护者。他们各自有一个公开的Bitbucket
仓库,而小明的仓库包含了正式工程。
小红fork
正式项目
小红先要fork
小明的Bitbucket
仓库,开始项目的开发。她登陆Bitbucket
,浏览到小明的仓库页面,
点Fork
按钮。
然后为fork
出来的仓库填写名字和描述,这样小红就有了服务端的项目拷贝了。
小红克隆她的Bitbucket
仓库
下一步,小红克隆自己刚才fork
出来的Bitbucket
仓库,以在本机上准备出工作拷贝。命令如下:
git clone https://user@bitbucket.org/user/repo.git
请记住,git clone
会自动创建origin
远程别名,是指向小红fork
出来的仓库。
小红开发新功能
在开始改代码前,小红要为新功能先新建一个新分支。她会用这个分支作为Pull Request
的源分支。
git checkout -b some-feature
编辑代码
git commit -a -m "Add first draft of some feature"
在新功能分支上,小红按需要添加提交。甚至如果小红觉得功能分支上的提交历史太乱了,她可以用交互式rebase
来删除或压制提交。对于大型项目,整理功能分支的历史可以让项目维护者更容易看出在Pull Request
中做了什么内容。
小红push
功能到她的Bitbucket
仓库中
小红完成了功能后,push
功能到她自己的Bitbucket
仓库中(不是正式仓库),用下面简单的命令:
git push origin some-branch
这时她的变更可以让项目维护者看到了(或者任何想要看的协作者)。
小红发起Pull Request
Bitbucket
上有了她的功能分支后,小红可以用她的Bitbucket
账号浏览到她的fork
出来的仓库页面,点右上角的【Pull Request
】按钮,发起一个Pull Request
。弹出的表单自动设置小红的仓库为源仓库,询问小红以指定源分支、目标仓库和目标分支。
小红想要合并功能到正式仓库,所以源分支是她的功能分支,目标仓库是小明的公开仓库,而目标分支是master
分支。另外,小红需要提供Pull Request
的标题和描述信息。如果需要小明以外的人审核批准代码,她可以把这些人填在【Reviewers】文本框中。
创建好了Pull Request
,通知会通过Bitbucket
系统消息或邮件(可选)发给小明。
小明review Pull Request
在小明的Bitbucket
仓库页面的【Pull Request
】Tab可以看到所有人发起的Pull Request
。点击小红的Pull Request
会显示出Pull Request
的描述、功能的提交历史和每个变更的差异(diff
)。
如果小明想要合并到项目中,只要点一下【Merge
】按钮,就可以同意Pull Request
并合并到master
分支。
但如果像这个示例中一样小明发现了在小红的代码中的一个小Bug
,要小红在合并前修复。小明可以在整个Pull Request
上加上评注,或是选择历史中的某个提交加上评注。
小红补加提交
如果小红对反馈有任何疑问,可以在Pull Request
中响应,把Pull Request
当作是她功能讨论的论坛。
小红在她的功能分支新加提交以解决代码问题,并push
到她的Bitbucket
仓库中,就像前一轮中的做法一样。这些提交会进入的Pull Request
,小明在原来的评注旁边可以再次review
变更。
小明接受Pull Request
最终,小明接受变更,合并功能分支到master
分支,并关闭Pull Request
。至此,功能集成到项目中,其它的项目开发者可以用标准的git pull
命令pull
这些变更到自己的本地仓库中。
下一站
到了这里,你应该有了所有需要的工具来集成Pull Request
到你自己的工作流。请记住,Pull Request
并不是为了替代任何基于Git
的协作工作流,而是它们的一个便利的补充,让团队成员间的协作更轻松方便。
Git - Pull Request工作流的更多相关文章
- Pull Request 工作流——更高效的管理代码
目录 Pull Request 工作流--更高效的管理代码 1.问题 2.解决方案 3.Git分支流管理代码具体实施 3.1本地分支操作管理 3.1.1查看分支 3.1.2创建分支 3.1.3切换分支 ...
- git pull request 流程
git pull request 用于在 fork 官方 repo 到个人 github, 在本地修改后,向官方 repo 请求合并.在官方团队审查过代码后,就可以将自己所做的改动合并到官方 repo ...
- Git工作流指南:Pull Request工作流
参考地址:http://blog.jobbole.com/76854/ Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式 ...
- git pull request
如何发 PR 以下以 wiki-pages 为例 把项目 fork 到自己名下,然后 clone 到本地 git clone git@code.xiaojukeji.com:yexiliang/wik ...
- git fork , git pull request那回事
git fork 原理 相当于你在原项目的主分支上又建立了一个分支,你可以在该分支上任意修改,如果想将你的修改合并到原项目中时,可以pull request,这样原项目的作者就可以将你修改的东西合并到 ...
- 好代码是管出来的——Git的分支工作流与Pull Request
上一篇文章介绍了常用的版本控制工具以及git的基本用法,从基本用法来看git与其它的版本控制工具好像区别不大,都是对代码新增.提交进行管理,可以查看提交历史.代码差异等功能.但实际上git有一个重量级 ...
- GIT团队合作探讨之二--Pull Request
pull request是github/bitbucket给开发人员实现便利合作提供的一个feature.他们提供一个用户友好的web界面在进代码之前来讨论这些变更. 简单说,pull request ...
- git 上的pull request 是什么意思?
1.git 上有常见的pull request 功能 2.pull request 的含义 解释一: 有一个仓库,叫Repo A.你如果要往里贡献代码,首先要Fork这个Repo,于是在你的Gi ...
- Git使用之pull request
一直对git的使用都不熟,由于工作需要经常需要在github上pull request,第一次还是有些麻烦的,写个笔记记录下 1. fork源项目到自己的github仓库中 fork之后自己也会多出一 ...
随机推荐
- 如何构建高性能MySQL索引
本文的重点在于如何构建一个高性能的MySQL索引,从中你可以学到如何分析一个索引是不是好索引,以及如何构建一个好的索引. 索引误区 多列索引 一个索引的常见误区是为每一列创建一个索引,如下面创建的索引 ...
- 分页功能实现之通过ajax实现表单内容刷新
拿代码来说话 我们的需求就是点击翻页功能,实现表格内容局部刷新且能够翻到对应的页面上,不明白? 那么就看看下面的图,需要达到的效果如下所示: 现在要实现的功能就是把红线框起来的表单内容 在点击翻页的时 ...
- Windows下使用最新的JDK1.7.0_51以上版本连接Jenkins出现SecurityException
我在slave节点上安装了jdk1.8, 当在节点上启动slave-agent的时候,报安全性限制的错误: java.lang.SecurityException: Missing required ...
- mysql触发器应用和创建表错误代码: 1118 Row size too large. 解决
1.针对数据库查询问题的方便,可以建立重要表的log备份记录表,在主表的添加,修改,删除添加触发器,修改触发器增加触发字段的点,限制条件. 数据库log表查问题比从线上多台服务器上下载日志文件相对方便 ...
- QT QGraphicsProxyWidget对象可选择或移动的一些tricks
我在QT图形视图框架中使用QGraphicsProxyWidget嵌入widget,但是无法使其和其它的QGraphicsItem一样可以选择或移动,使用如下语句无效: C++ Code 1234 ...
- 让你的应用支持新iPad的Retina显示屏
一.应用图片标准iOS控件里的图片资源,苹果已经做了相应的升级,我们需要操心的是应用自己的图片资源.就像当初为了支持iPhone 4而制作的@2x高分辨率版本(译者:以下简称高分)图片一样,我们要为i ...
- Aspose------导入Excel
代码: public List<T> ImportExcelToList<T>() { HttpContext context = HttpContext.Current; ) ...
- Java单例模式的应用
单例模式用于保证在程序的运行期间某个类有且仅有一个实例.其优势在于尽可能解决系统资源.通过修改构造方法的访问权限就可以实现单例模式. 代码如下: public class Emperor { priv ...
- css后台页面布局技巧
目标: 实现左边侧边栏固定,右边内容区自适应 侧边栏内容较少时背景100%高度展示 侧边栏内容较多时可以滚动,且不让显示滚动条(显示太丑) 内容区较少时不出现滚动条,较多时可以滚动 code: < ...
- VMware按装ISO
破解码 vmware12 5A02H-AU243-TZJ49-GTC7K-3C61N vmware14CG54H-D8D0H-H8DHY-C6X7X-N2KG6 创建虚拟机 也可以选第三个直接选择Ce ...