Git 分支合并时 Merge, Rebase, Squash 的使用场景

前言

Git 的分支设计大大提升了并行开发的能力,但相应的,也就要解决如何进行分支合并。毕竟分久必合,最终还是要把大家的工作合并起来,进行统一发布的。在合并时,通常有三种操作:

  • Merge commits
  • Rebase
  • Squash

不同的开发者有不同的选择,前两天 HashiCorp 的创始人 Hashimoto 发了一贴 Merge vs. Rebase vs. Squash,也表达了他的观点。

file

Hashimoto 的观点

我经常被问到我对 merge commits、rebase 和 squash 的看法。我已经多次回复,因此我决定记录一下,以便每当被再次问到时我都可以引用它。

我根据情况使用 merge commits,squash,rebase。我相信它们都有各自的优点,但它们的使用取决于上下文。我认为任何说某个特定策略 100% 都是正确答案的人都是错误的,但我认为在使用每种策略时都有相当大的可回旋的余地。以下是我个人专业角度的观点:

我更喜欢 merge 并且创建 merge commits,因为我认为它最能代表提交的真实历史。您可以看到 merge 点,您可以看到开发人员经历的所有 WIP 提交。您可以轻松恢复整个合并 (git revert -mN)。每 10 个 PR 中我创建的 merge commits 超过 9 个。

我还相信,只要每次提交都能编译构建,那么拥有更多的提交会让 git bisect 更好。当我把一个项目一分为二,结果却从一个类似 +2000/-500 的单个 PR 中得到了一个被 squash 的提交时,我真的是讨厌,讨厌,再讨厌。那是……一点帮助都没有。我想一分为二并提交最坏的情况也就是比如 +500/-500,这是最坏的情况了。理想情况下,我的提交更像是 +50/-50。然后我可以说「啊哈,bug 就在那里」。Squash 会破坏这些信息。如果在 1000 次 +50/-50 的提交和 1 次 squash 之间选择,每一次我都会选择前者。

使用 merge commits 策略依赖于开发人员在每次提交构建时保持良好的洁癖 (hygiene)。我 99% 的时间都遵循这条规则(我会犯错误,但我努力不犯错误)。在 OSS 中,您无法真正控制这一点,有时我最终会修复人们的提交(在进行 merge commits 之前使用交互式 rebase)。在我担任工程领导者的专业环境中,我通常希望与我一起工作的工程师保持每次提交都是可构建的。

不过,当 PR 有无数微小的 “WIP” “WIP” “WIP” 提交,但实际上是为了实现一个目标而差异相对较小时,我会 squash。这是我使用 squash 的场景。我在重写提交消息时会非常注意,让它拥有描述性。Git 和 GitHub 创建的默认 squash 提交消息并不好(它只是连接所有被 squash 的提交消息,通常是一系列 “WIP”)。

如果您有很大的差异并且有很多 “WIP”,那么我会(以交互方式)rebase,并有选择地在有意义的地方 squash 和重新排序提交。我倾向于期望开发人员这样做并保持洁癖,但不幸的是很多开发人员对 Git 的使用并不熟练。在 OSS 世界中,我会帮他们擦擦屁股。我当年担任工程经理时,我预期和我一起工作的工程师都具备这些知识。

关于最后一点,我还倾向于使用 Git GUI 客户端进行大型交互式 rebase。我对 Git CLI 非常满意,但是当我以交互方式对一个非常大的 PR(例如 50 多个提交)进行大量更改的 rebase 时,我发现使用 GUI 会很有帮助。我使用的是 macOS,所以我使用 Tower。不过,这是我真正使用 GUI 的唯一场景。

结语

file

虽然 HashiCorp 是以 Hashimoto 的名字命名的,不过他本人已经不再担任领导岗位,而是做回一名工程师,捣鼓一个新的 Terminal。即使对 CLI / Terminal 操作熟练如他,依然在应付复杂的 rebase 时,要借助 GUI 工具。我个人也使用 Tower (刷了网页,发现它还正好在促销)。

file

说到合并采用的策略,我通常会先 rebase,squash 用的也不算少。精神上我支持 Hashimoto 的观点,但实践中,尤其是团队开发,要保持 merge commits 的洁癖对团队要求比较高。所以更实际的做法,是提倡创建小 PR,快分快合。
另外 Bytebase 也把分支功能 (Branching) 引入到了数据库变更中了,欢迎大家去试试。

file


💡 更多资讯,请关注 Bytebase 公号:Bytebase

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/218911.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA启动失败报错解决思路

IDEA启动失败报错解决思路 背景:在IDEA里安装插件失败,重启后直接进不去了,然后分析问题解决问题的过程记录下来。方便下次遇到快速解决。也是一种解决问题的思路,分享出去。 启动报错信息 Internal error. Please refer to https…

Day28 回溯04

Day28 回溯04 这题注意,需要数层去重

界面控件DevExpress WinForms Sunburst组件,轻松可视化分层扁平数据!

DevExpress WinForms Sunburst控件允许用户以紧凑和视觉上吸引人的方式可视化分层和扁平数据。 DevExpress WinForms有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。同时能完美构建流畅、美观且易于使用的应用程序,无论是Office风…

在Windows操作系统上使用rtsp simple server和ffmpeg推送录屏视频流

大纲 1 搭建启动rtsp server2 推送录屏视频流下载FFmpeg 3 检验3.1 获取本机IP3.2 检测 1 搭建启动rtsp server 从https://github.com/aler9/rtsp-simple-server/releases下载Windows版本的编译结果。 解压,然后启动该程序 2 推送录屏视频流 下载FFmpeg 从htt…

JS生成登录验证码

采用js生成登录的验证码 采用的技术点有html&#xff0c;css&#xff0c;JS&#xff0c;jQuery HTML&#xff1a; <div class"box_b"><img src"./img/0775639c-c82c-4a29-937f-d2a3bae5151a.png" alt""><div class"regist…

MIT线性代数笔记-第23讲-微分方程,exp(At)

目录 23.微分方程&#xff0c; e x p ( A t ) exp(At) exp(At)用矩阵求解微分方程矩阵指数二阶常微分方程 打赏 23.微分方程&#xff0c; e x p ( A t ) exp(At) exp(At) 用矩阵求解微分方程 例&#xff1a; { d u 1 d t − u 1 2 u 2 d u 2 d t u 1 − 2 u 2 \left \{ \b…

什么是呼叫中心的语音通道?呼叫中心语音线路有几种?

什么是呼叫中心的语音通道&#xff1f; 呼叫中心的语音通道是指在呼叫中心中使用的语音信号传输通道&#xff0c;它是呼叫中心中至关重要的一部分&#xff0c;负责将客户的语音信息传递给客服代表&#xff0c;以及将客服代表的语音信息传递给客户。在呼叫中心的运营中&#xf…

【UE】UEC++委托代理

目录 【UE】UEC委托代理 一、委托的声明与定义 二、单播绑定与解绑 三、多播绑定与解绑 四、动态单播绑定与解绑 五、动态多播绑定与解绑 六、委托的调用 七、运行结果 1、运行开始 2、调用单播 3、调用多播 4、调用动态单播 5、调用动态多播 6、运行结束 【UE】…

傻傻分不清楚的分区、分库、分表

一、分区 MySQL 在 5.1 时添加了对 分区&#xff08;即水平分区&#xff09; 的支持。MySQL 的物理数据存储在表空间文件&#xff08;.ibdata1和.ibd&#xff09;中&#xff0c;分区 的意思是指将同一表中不同行的记录分配到不同的物理文件中。有几个分区就有几个 .idb 文件。…

到手价价格监测如何实现

渠道中的低价数据是品牌非常头疼的问题&#xff0c;治理低价、乱价也是在治理窜货&#xff0c;品牌需要长期执行&#xff0c;并且要有监测渠道价格的能力&#xff0c;监测价格不能只对页面价进行输出&#xff0c;要监测链接中的到手价&#xff0c;这就包含对所有促销信息内容的…

Netty01-NIO与BIO

NIO 什么是NIO Java NIO 全称 java non-blocking IO&#xff0c;是指JDK 1.4 及以上版本提供的新API&#xff08;New IO&#xff09;。从 JDK1.4 开始&#xff0c;Java 提供了一系列改进的输入/输出的新特性&#xff0c;为所有的原始类型&#xff08;boolean类型除外&#xf…

Hive的metastore服务的两种运行模式

Hive的metastore服务的作用是为Hive CLI或者Hiveserver2提供元数据访问接口 1.metastore运行模式 metastore有两种运行模式&#xff0c;分别为嵌入式模式和独立服务模式。下面分别对两种模式进行说明&#xff1a; &#xff08;1&#xff09;嵌入式模式 &#xff08;2&#x…

基于springboot + vue在线考试系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

【PID学习笔记 5 】控制系统的性能指标之一

写在前面 PID在实际工程中最重要的工作就是调参&#xff0c;那么首先就要了解控制系统的性能指标。上文最后简要介绍了控制系统的基本要求&#xff0c;本文开始将系统学习控制系统的性能指标&#xff0c;内容比较多&#xff0c;初步计划是分三节来讲解。本文重点介绍性能指标的…

Bishop新著 - 深度学习:基础与概念 - 前言

译者的话 十几年前&#xff0c;笔者在MSRA实习的时候&#xff0c;就接触到了Christopher M, Bishop的经典巨著《Pattern Recogition and Machine Learning》(一般大家简称为PRML)。Bishop大神是微软剑桥研究院实验室主任&#xff0c;物理出身&#xff0c;对机器学习的基本概念…

银行固定资产巡检管理盘点解决方案

随着金融业务的拓展&#xff0c;银行对办公设备、电子设备等固定资产的需求不断增加&#xff0c;因此&#xff0c;固定资产投入和资产生命周期的管理变得日益重要&#xff0c;由于管理体制、制度等因素不完全协调同步&#xff0c;银行在固定资产投入及管理方面面临诸多问题。 …

优雅草蜻蜓I即时通讯·水银版私有化部署之java服务端搭建教程-01

目录 前言1 1 安装 mongodb2 2 安装 redis3 3. 安装jdk3 4 解压 spring-boot-imapi3 5.开始安装 消息队列组件 rocket4 6. 安装推送服务5 7. 安装 message-push5 8. 安装uplooad 服务5 9&#xff1a; 安装nginx 服务7 1.不需要SSL7 2.需要SSL7 五&#xff1a;编译…

数字图像处理(实践篇)十八 人脸检测

目录 一 使用opencv进行人脸检测 二 使用face_recognition进行人脸检测 一 使用opencv进行人脸检测 1 haarcascade_frontalface_default.xml 方法① 下载 地址&#xff1a;https://github.com/opencv/opencv/tree/master/data/haarcascades 点击haarcascade_frontalface_d…

Java零基础——RocketMQ篇

1.RocketMQ简介 官网&#xff1a; http://rocketmq.apache.org/ RocketMQ是阿里巴巴2016年MQ中间件&#xff0c;使用Java语言开发&#xff0c;RocketMQ 是一款开源的分布式消息系统&#xff0c;基于高可用分布式集群技术&#xff0c;提供低延时的、高可靠的消息发布与订阅服…

Cyanine7-NHS ester荧光染料的化学结构、光谱性质和荧光特性

Cyanine7-NHS ester的结构包括一个靛菁环结构和一个NHS ester活性基团。NHS ester官能团是一种活化基团&#xff0c;用于将染料共价结合到含有游离氨基官能团的生物分子上。 **光谱性质&#xff1a;**Cyanine7-NHS ester的光谱性质通常包括&#xff1a; **激发波长&#xff08…