前言

利用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原理类似,只是需要结合更为复杂的合并策略进行分析。文中若有疏漏,欢迎指正补充。

好了,该去复习复习寻找两节点最近公共父节点的原理了^_^

比较好的文章推荐

https://zhuanlan.zhihu.com/p/26227256

Git中的"pull request"真正比较的是什么?的更多相关文章

  1. [技术博客]在团队中使用Pull Request来管理代码

    在团队中使用Pull Request来管理代码 前言 在参加多人共同开发项目,且选用Git作为代码托管工具的时候,我们不免会遇到分支冲突.覆盖.合并等问题.显然,因为同一个仓库是属于大家的,所以每个人 ...

  2. git 上的pull request 是什么意思?

    1.git 上有常见的pull request 功能 2.pull request 的含义 解释一:    有一个仓库,叫Repo A.你如果要往里贡献代码,首先要Fork这个Repo,于是在你的Gi ...

  3. Git使用之pull request

    一直对git的使用都不熟,由于工作需要经常需要在github上pull request,第一次还是有些麻烦的,写个笔记记录下 1. fork源项目到自己的github仓库中 fork之后自己也会多出一 ...

  4. GitHub中PR(Pull request)操作

    1. 贡献代码: 贡献代码,通俗的说,就是自己修改了代码,希望合并到别人的Repository(仓库)中.将自己的智慧贡献给开源社区.下面将详细讲解步骤 1.1 第一步:fork 在GitHub社区闲 ...

  5. (转载)新手如何正确理解GitHub中“PR(pull request)”中的意思

    我从知乎看到的两个答案,分别从实际意义以及语言学角度告诉你改怎么理解PR,很简洁,这个理解非常棒,会解决新手刚看到PR(pull request)这个词时的困惑.   实际意义:   有一个仓库,叫R ...

  6. (转)GitHub中PR(Pull request)操作 - 请求合并代码

    转:https://www.jianshu.com/p/b365c743ec8d 前言 本文尽量使用图形工具介绍如何向开源项目提交 Pull Request,一次亲身经历提交 PR 1.fork 项目 ...

  7. 在Git的PR(Pull Request)提示冲突无法merge合并的解决方案

    问题 假设有一个分支A,向master分支提交PR,然后发生无法自动解决的冲突,PR提示不能执行merge合并. 解决方案1 本地checkout检出并切换到A分支,pull拉取更新到最新代码 在本地 ...

  8. idea git 发起一个pull request 请求

  9. Git工作流指南:Pull Request工作流

    参考地址:http://blog.jobbole.com/76854/ Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式 ...

随机推荐

  1. hive 数值计算函数

    Hive数值计算函数 (1)round(45.666,2)作用:四舍五入,保留2位小数 ceil(45.6) 作用:向上取整         floor(45.6) 作用:向下取整 (2)rand() ...

  2. 使用Spring+MySql实现读写分离(一)关于windows下安装mysql5.6

    前面讲过关于mysql的优化,主要是建表时对于大量数据的表添加索引机制,提高查询效率,以及一些sql语句的简单优化,毕竟我也不是专业的数据库管理员,大牛勿喷. 今天写两章关于javaweb项目中,对于 ...

  3. Python 基础API

    针对python的os库一些API记录,觉得python的命名并不好,很多API看名字,并不知道具体功能是什么 1. os.path.basename() 得到文件名称,不包括路径,例子:/var/t ...

  4. Chapter 1: Plug-in programing from past to the future

    It is the best time. Although the internal API of Android not allowed to be modified by google play, ...

  5. 工作了才发现display全忘了

    CSS display属性这几天用的我头疼 人老了 健忘了 1.inline(行内元素) 是元素变成行内元素,拥有行内元素特性,共享属性,不会吃独食! 共享经济时代 inline是主导大哥 !impo ...

  6. Android P正式版即将到来:后台应用保活、消息推送的真正噩梦

    1.前言 对于广大Android开发者来说,Android O(即Android 8.0)还没玩热,Andriod P(即Andriod 9.0)又要来了.   下图上谷歌官方公布的Android P ...

  7. Javascript高级编程学习笔记(68)—— 事件(12)设备事件

    设备事件 随着智能手机与平板电脑的普及,为了更好地让用户与这些设备进行交互 浏览器引入了一种新的方式,而一类新的事件也应运而生,这就是设备事件 W3C从2011年开始制定关于设备事件的草案 下面将会介 ...

  8. python 安装 reportlab 报错 “ImportError: No module named reportlab.lib”

    reportlab是什么? 是一个处理PDF和画图的python开源库. 初次安装: pip install reportlab 重新安装: pip install --upgrade --force ...

  9. Java 中的 String 真的是不可变吗?

    我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码. public final class String implements java.io.Seriali ...

  10. IntelliJ IDEA 与 SVN配置

    问题背景 如果开发工具使用的是IntelliJ IDEA,版本管理工具使用的是SVN. 就涉及到SVN集成的问题,但是可能会遇到选择在IDEA中配置SVN的时候,在SVN的安装bin目录找不到文件 s ...