InfoQ Geekathon 大模型技术应用创新大赛 了解详情
写点什么

如何审查合并的提交

  • 2014-03-06
  • 本文字数:978 字

    阅读完需:约 3 分钟

近日,苹果公司新发布的 iOS 7.0.6 一度闹得沸沸扬扬,这是由于它修复了一个因goto 而引起的bug 。对于广大开发者来说,这个bug 出现的原因以及如何避免其出现,成了热议的话题。

知名博主陈皓分享了他对于该事件的思考。他认为这可能是代码在合并过程中导致的bug,而这种bug 却很难在代码审查时被发现。

前微软工程师,现就职于 Github Phil Haack 在其博客中分享了他的团队是如何审查合并提交的。在此前,他们的合并流程是这样的(假设要将 master 分支合并到 long-running-branch 分支上):

  1. 在 long-running-branch 分支上创建一个新的分支:merge-master-into-long-running-branch。
  2. 在该分支上执行合并。
  3. 将该分支推送(push)到 Github 上。
  4. 根据该提交创建一个拉请求(pull request),请团队其他人进行审查。

在 git 中,这相当于执行下面的命令集:

复制代码
git checkout long-running-branch
git checkout -b merge-master-into-long-running-branch
git merge master
# Manually do a lot of work to resolve the conflicts and commit those changes
git push origin merge-master-into-long-running-branch

然而这样的方式可能会产生问题。Phil 的同事 Paul Betts 指出,在将一个分支合并到另一个的时候,该合并提交的 diff 将显示从最后一次合并之后的所有改变。这很可能是已经审查过的代码。而我们真正想要看到的,是这次提交是否有冲突,以及如何解决这些冲突。

参与 LibGit2 开发的 Russell Belfer 给出了答案。

在将一个分支合并到另一个分支时,会在这两个分支上各创建一个合并提交。以 SignalR 一次合并提交为例。该提交要将 release 分支合并到 dev 分支,该提交的 SHA 为 cc5b002a5140e2d60184de42554a8737981c846c,以 cc5b002a 代替。

我们可以使用 git diff 命令,从两个父分支上分别查看这个合并。例如:

复制代码
git diff cc5b002a^1 cc5b002a
git diff cc5b002a^2 cc5b002a

如果只想查看冲突的部分,可以使用 git show 命令:

复制代码
git show --cc cc5b002a

git show 所展示的内容,要比整个合并提交的diff 少得多,因为–cc 选项可以忽略没有冲突的部分,即只显示与该提交的所有父分支都不相同的部分。这样,审阅者就可以更加专注于冲突的部分,从而降低bug 发生的概率。

Phil 在文章最后介绍了他是如何发现这样一个合并冲突的示例的。他执行了 git log --min-parents=2 -p --cc 命令,从而找出了至少有两个父分支的提交。

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2014-03-06 09:181021
用户头像

发布了 59 篇内容, 共 21.7 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

我国数字经济规模已达41万亿元 总量跃居世界第二

CECBC

【案例】服务邮政快递业安全监管 星环科技助力国家邮政局“绿盾”大数据平台建设

星环科技

格物致知,零代码训练营第三期顺利结业

明道云

【IT运维】快速解决IT疑难故障就用行云管家!

行云管家

系统运维 堡垒机 IT运维

打造区块链“三大平台” 助推数字化转型

CECBC

Vue3异步数据加载组件:suspense

devpoint

Vue 3 8月日更

客户选型零代码软件到底在对比哪些方面?

明道云

Express Flutter SDK 全面支持空安全

ZEGO即构

flutter 大前端 音视频 空安全

Snowflake如日中天是否代表Hadoop已死?大数据体系到底是什么?

阿里云大数据AI技术

「SQL数据分析系列」15. 元数据

数据与智能

sql 脚本 元数据

斯图飞腾产品升级!Stratifyd数据分析平台全新改版

万人连麦的幕后技术详解

拍乐云Pano

【前端 · 面试 】HTTP 总结(三)—— HTTP 请求方法

编程三昧

面试 大前端 HTTP 8月日更 HTTP方法

架构实战营 毕业设计

竹林七贤

用好这两个小工具,制作乐谱更高效!

懒得勤快

他是如何被公司辞退,再到1000个小时后拿到阿里巴巴offer的?

Java架构师迁哥

能力圈与焦虑:焦虑是因为自己能力不够吗?

非著名程序员

个人成长 提升认知 焦虑 8月日更

全球生态合作伙伴纷至沓来 解码AppGallery 2021“期中成绩单”

叶落便知秋

华为

Vue进阶(二):Vue 项目文件结构介绍

No Silver Bullet

Vue 8月日更 项目结构

分布式性能测试框架用例方案设想(三)

FunTester

性能测试 接口测试 测试框架 测试开发

声网Agora发布教育信息化解决方案 助力教育公平提效

声网

人工智能 在线教育

架构实战营 模块四作业

孫影

架构实战营 #架构实战营

阿里高工从入门,基础,进阶到项目实战,全面讲解spring boot

Java 程序员 架构 面试 spring Boot Starter

赋能后疫情时代的商业创新,用友BIP的力量

海比研究院

鬼斧神工!阿里架构师把多线程编程精华全部总结到这份《Java并发手册》里面了

Java 编程 架构 面试 计算机

使用SpringAop对方法进行增强

捡对象的cy

spring aop

Fil行情:投资fil的成本有哪些?

区块链 分布式存储 IPFS fil fil成本

Vue进阶(一):Vue 学习资料汇总

No Silver Bullet

Vue 8月日更

基于docker的分布式性能测试框架功能验证(三)

FunTester

分布式 性能测试 接口测试 测试框架 测试开发

精彩回顾 | 阿里云 Serverless Developer Meetup 杭州站亮点有这些!

阿里巴巴云原生

阿里云 Serverless 云原生 Meetup

体验设计落地的四个原则和十个步骤

石云升

用户体验 关键时刻 体验设计 8月日更

  • 扫码添加小助手
    领取最新资料包
如何审查合并的提交_语言 & 开发_姚琪琳_InfoQ精选文章