Git中的"pull request"真正比较的是什么?
前言
利用git版本控制工具时,我们通常会从主分支拉出新分支进行开发,开发完成后创建pr(也就是pull request),让其他小伙伴帮忙review,确定代码没有问题后再将新分支合并到主分支上。但是,你真的理解pull request中比较的两个分支到底是谁吗?
下面以一个虚拟案例进行说明:假设主分支名为“Master”,拉出来的新分支名为“developBrance1”。
注:图中的箭头指代工作推进方向,而不是提交的指向(提交指向总是由当前提交指向父提交,和这里的箭头是反着的)
最简单的情况

上图中,我们从主分支Master的m1提交点拉出新分支developBranch1,然后在developBranch1分支上开发(开发过程中产生了d1、d2、d3共3个提交),开发完成后创建pr,然后经过Review后将其合并到主分支上形成新的提交点N。自然而然地,我们创建pr时选择的源和目标为:
src[developBranch1] -> dest[Master]
我们期望pr比较的是developBranch1和Master这两个分支的最新提交点,pr实际比较的也是developBranch1的d3提交点和Master分支的m1提交点之间的差异。
增加一点复杂度
假设现在有其他小伙伴和你一同工作(这才是工作中的场景),另外一名小伙伴也从Master分支的m1提交点拉出分支developBranch2进行开发,并产生了若干提交,而且在我们开发完成之前已经合并到了Master分支上:

现在我们创建pr时,源和目标自然还是:
src[developBranch1] -> dest[Master]
但此时pr实际比较的是developBranch1和Master这两个分支的最新提交点吗( developBranch1的d3提交点和Master分支的m2提交点)?
答案:不是的。现在pr比较的其实是developBranch1的d3提交点和Master分支的m1提交点,和上面最简单的情况完全没有差别!
其实pr的底层这样实现非常有道理:
我们创建pr时,两个分支比较的差异只是自己开发的内容。试想,如果合作开发情况下比较developBranch1的d3提交点和Master分支的m2提交点之间的差异,那我们会同时看到其他小伙伴的开发内容,你会想,这不是反应了“最新工作进度”吗?不就是多看一个小伙伴的代码吗?好,再试想如果同时有很多人开发,我们提交自己的代码时,夹杂了许多其他小伙伴的代码,你会不会因找不到自己开发的代码而发疯?
“最新工作进度”的疑惑还在吧?下面来解答。
git是如何反映最新工作进度的?
其实,git合并不同分支时,会自动取它们的并集,以保持最终工作进度。就拿上图说,如果developBranch1的d3提交点和developBranch2的o2提交点之间不存在冲突,两者的开发工作最终都会在m3中体现(当然,有冲突了就需要手动解决)。
现在还有一个问题,pr比较的原理是什么?
pr比较的是:
源分支的最近提交点和源分支和目标分支的最近公共父提交节点之间的差异。在文中第二张图中,可以看到源分支是developBranch1,目标分支是Master,两个分支的最近公共父提交节点是m1;所以最终比较的就是源分支的最近提交点d3和m1。
探索欲强的读者也可以试试把不同分支分别作为pr的源和目标,观察pr输出的差异,以加深印象。
后记
其他更为复杂的分支pr原理类似,只是需要结合更为复杂的合并策略进行分析。文中若有疏漏,欢迎指正补充。
好了,该去复习复习寻找两节点最近公共父节点的原理了^_^
比较好的文章推荐
Git中的"pull request"真正比较的是什么?的更多相关文章
- [技术博客]在团队中使用Pull Request来管理代码
在团队中使用Pull Request来管理代码 前言 在参加多人共同开发项目,且选用Git作为代码托管工具的时候,我们不免会遇到分支冲突.覆盖.合并等问题.显然,因为同一个仓库是属于大家的,所以每个人 ...
- 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之后自己也会多出一 ...
- GitHub中PR(Pull request)操作
1. 贡献代码: 贡献代码,通俗的说,就是自己修改了代码,希望合并到别人的Repository(仓库)中.将自己的智慧贡献给开源社区.下面将详细讲解步骤 1.1 第一步:fork 在GitHub社区闲 ...
- (转载)新手如何正确理解GitHub中“PR(pull request)”中的意思
我从知乎看到的两个答案,分别从实际意义以及语言学角度告诉你改怎么理解PR,很简洁,这个理解非常棒,会解决新手刚看到PR(pull request)这个词时的困惑. 实际意义: 有一个仓库,叫R ...
- (转)GitHub中PR(Pull request)操作 - 请求合并代码
转:https://www.jianshu.com/p/b365c743ec8d 前言 本文尽量使用图形工具介绍如何向开源项目提交 Pull Request,一次亲身经历提交 PR 1.fork 项目 ...
- 在Git的PR(Pull Request)提示冲突无法merge合并的解决方案
问题 假设有一个分支A,向master分支提交PR,然后发生无法自动解决的冲突,PR提示不能执行merge合并. 解决方案1 本地checkout检出并切换到A分支,pull拉取更新到最新代码 在本地 ...
- idea git 发起一个pull request 请求
- Git工作流指南:Pull Request工作流
参考地址:http://blog.jobbole.com/76854/ Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式 ...
随机推荐
- tcp/ip 三次握手和4次挥手
TCP连接两个端口,谁也发起请求,谁就是client端A,另外一个接受请求的server端B.第一次握手:A向B发一个链接请求,带一个seq = x,SYN= x. 第二次握手:B收到链接请求之后向A ...
- feign调用spring clound eureka 注册中心服务
@RestController public class TestService { private TestApi computeClient; private static final Strin ...
- 【洛谷4172】 [WC2006]水管局长(LCT)
传送门 洛谷 BZOJ Solution 如果不需要动态的话,那就是一个裸的最小生成树上的最大边权对吧. 现在动态了的话,把这个过程反着来,就是加边对吧. 现在问题变成了怎么动态维护加边的最小生成树, ...
- elasticSearch新认知
之前已经学习使用过ElasticSearch的使用,今天补充巩固一下... 上一次的环境是在 linux下使用 EalsticSearch(安装教程详见:https://www.cnblogs.com ...
- ajax&bootstrap
1.ajax 后台 # 通过flask框架搭建后台 from flask import flask,request # 创建一个服务器对象 app = Flask(__name__) # 解决ajax ...
- 高数复习--什么是DCT
离散余弦变换(英语:discrete cosine transform, DCT)是与傅里叶变换相关的一种变换,类似于离散傅里叶变换,但是只使用实数.离散余弦变换相当于一个长度大概是它两倍的离散傅里叶 ...
- MySQL单表多字段模糊查询
今天工作时遇到一个功能问题:就是输入关键字搜索的字段不只一个字段,比如 我输入: 超天才 ,需要检索出 包含这个关键字的 name . company.job等多个字段.在网上查询了一会就找到了答案. ...
- 推荐一篇关于java集合的博文,写的很nice
这也是我自己在网上看到的一篇博文,作者的博文都很棒,以后还会持续为大家推荐好的博文,只要大家不骂我只会转别人的博文,自己不会写,其实这些都是基础,前辈们已经在实践中总结的很细很全了,所以也没必要去总结 ...
- 【原】gulp工作中的实战
写这篇文章的目的是为了以后的项目中懒得再去配gulp,直接可以拿这篇博客中的来用,因为有时候配置还是挺烦人的. gulp相关插件的介绍 用法比较简单,假设大家都会用gulp,下面主要介绍一下一些插件的 ...
- 【Python开发】Python中数据分析环境的搭建
注:无论是任何一门语言,刚开始入门的时候,语言运行环境的搭建都是一件不轻松的事情. Python的运行环境 要运行或写Python代码,就需要Python的运行环境,主要的Python有以下三类: 原 ...