前言

利用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

转载于:https://www.cnblogs.com/xiaoxi666/p/9526896.html

Git中的pull request真正比较的是什么?相关推荐

  1. 如何使用github中的pull request功能?

    * pull request是社会化编程的象征,通过这个功能,你可以参与到别人开发的项目中,并做出自己的贡献.pull request是自己修改源代码后,请求对方仓库采纳的一种行为*–<gith ...

  2. GitHub中PR(Pull request)操作

    GitHub中PR(pull Request)操作 GitHub已经成为所有程序员的天堂和地狱.众多程序员在此网站上活跃,想为开源贡献代码,就必须要学会提交PR.PR即是Pull Request操作 ...

  3. GitHub 中 Merge pull request 的 3 中选项说明

    Merge pull request 提供了 3 种 merge 方法: Create a merge commit:GitHub 的底层操作是 git merge --no-ff.feature 分 ...

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

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

  5. Git拉取pull request到本地命令

    通过 Git 拉取 github 上的 Pull Request(PR) 到本地进行 review: 如果自己使用的就是PR提交的仓库,命令为: git fetch origin pull/PRId/ ...

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

    转载于:https://www.cnblogs.com/hwgok/p/9514772.html

  7. 好代码是管出来的——Git的分支工作流与Pull Request

    上一篇文章好代码是管出来的--使用Git来管理源代码 介绍了常用的版本控制工具以及git的基本用法,从基本用法来看git与其它的版本控制工具好像区别不大,都是对代码新增.提交进行管理,可以查看提交历史 ...

  8. Git - Pull Request工作流

    Pull Requests是Bitbucket上方便开发者之间协作的功能.提供了一个用户友好的Web界面,在集成提交的变更到正式项目前可以对变更进行讨论. 开发者向团队成员通知功能开发已经完成,Pul ...

  9. github中fork,clone,push,pull request的简单理解

    如何理解github中的各个操作意思,表面上看如下: repository:仓库,可以理解为你的某个项目: Fork:叉子,像叉子一样,就是分支,这里是指一个分支: Clone:克隆,复制一个一模一样 ...

最新文章

  1. 一文看懂模糊搜索1.0到3.0的算法迭代历程
  2. python篮球-用Python让蔡徐坤在我的命令行里打篮球!|附完整代码
  3. 为什么openstack要用rabbitmq这类消息中间件来进行RPC这类的操作呢,直接rpc不行吗?
  4. qint64转字符串
  5. python函数定义及调用-Python函数及变量的定义和使用
  6. NLP自然语言处理必修清单(修炼法则)
  7. 【博客管理】博客资源汇总【置顶】
  8. 从Unity导出Obj格式的地形(Terrian)
  9. 开发中好用的工具(长期待更)
  10. vim中文乱码问题解决方式
  11. python画图时设置分辨率和画布大小-plt.figure()
  12. 再见 Excel,你好 Python Spreadsheets! ⛵
  13. 【问题3】:Kaggle练习题《房价预测》----分别采用的岭回归,随机森林,bagging模型,AdaBoost,XgBoost等。
  14. 苹果台式机怎么设置我的电脑计算机,苹果电脑一体机怎么开机_苹果台式一体机开机在哪-win7之家...
  15. 20221024 今天的世界发生了什么
  16. python安装Python包时报错处理
  17. vsCode安装less插件并配置
  18. 专转本计算机题型英语,2006江苏专转本计算机 2006-2011江苏专转本英语真题及答案.doc...
  19. Android评分栏示例
  20. Tomcat配置文件信息泄露

热门文章

  1. 1.6编程基础之一维数组_01与指定数字相同的数的个数
  2. 普通背包问题-枚举算法(《算法竞赛宝典》 第二部 基础算法艺术)
  3. 派生类构造的时候一定要调用_夏天使用电蚊香的时候一定要注意这几点
  4. python字符数组输出_python字符串格式化输出
  5. Linux 系统增加Swap分区扩容运行内存
  6. C++工作笔记-for与foreach之间的初步比较(反汇编初步窥探)
  7. C++工作笔记-根据父类指针获取子类类型(或不同的对象)
  8. java $ class_java文件编译后额外生成的$1.class是怎么一回事
  9. android 属性动画实例,Android 属性动画Animator工具类代码案例
  10. 计算机主机名称命令,怎么用dos指令修改计算机名