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

Git PR合并策略:squash、merge commit与rebase的本质区别与工程选择 Git PR合并不是简单的代码集成操作,而是对提交历史语义、协作可追溯性与工程可维护性的系统性设计。其核心涉及三种基础机制:创建合并提交(--no-ff)保留分支拓扑与集成上下文;压缩合并(squash and merge)生成线性简洁历史但丢失中间迭代;变基合并(rebase and merge)实现提交线性化却牺牲原始时间戳与冲突可审计性。技术价值在于支撑快速故障定位(git bisect)、精准责任归属(git blame)、合规审计与新人上手效率。典型应用场景包括CI/CD流水线触发逻辑适配、mon 阅读详情

前言

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

Git Merge、Rebase 和 Squash 之间的区别 相反,Merge、Rebase 和 Squash 具有相同的基本目的,但提供了有关如何管理分支的不同视角。每个命令都提供了一个独特的视角,您可以通过它来导航和增强分支管理,从而为您的版本控制方法提供多功能性。它创建了一个合并提交,但也保持了项目历史的线性和干净。合并基本上会创建一个新的合并提交,并将分支中的更改与该合并提交合并到目标分支。:将所有提交合并为一个提交,并创建干净的线性历史记录,但不提供有关提交的尽可能多的信息。:将当前分支的头部移动到目标分支的最后一个节点,并产生更线性的git历史记录。 阅读详情

相关推荐

别再乱用Git合并!手把手教你用Squash Merge和Rebase Merge优化提交历史

本文深入解析了Squash Merge和Rebase Merge两种Git合并策略,旨在帮助开发者优化提交历史。通过对比两者的核心原理、操作流程及适用场景,指导读者根据团队协作需求选择合适的方法,从而打造清晰、线性的提交历史,提升代码审查与项目维护效率。

weixin_28836989的博客 518

Git合并操作之merge、rebase、squash详解

有时在一个分支上完成一个功能的开发,开发完成后需要将其合并到主分支中。或者有时提交了很多个commit,它们之间的改动并不是很多,想将它们合并成一个commit,此时就需要使用GIT的合并操作。下面来介绍一下GIT中的几种合并操作: 1 git merge和git rebase git merge不对仓库历史做任何改变,它会保留分支上所有的历史commit,然后简单地创建一个合并的commit。 1.1 git merge 使用git merge将master分支合并到feature分支 git chec

主要分享嵌入式软件、人工智能部分知识 2万+

Git分支合并策略:Squash Merge与Rebase Merge的实战对比

本文深入对比了Git分支合并中的Squash Merge与Rebase Merge策略。通过实战案例解析了两者的核心差异:Squash Merge将多个提交压缩为一个,保持主分支历史整洁;而Rebase Merge则重写提交历史,形成线性记录。文章详细阐述了各自的操作流程、适用场景及潜在风险,帮助开发团队根据项目需求选择最合适的合并策略,以优化提交历史管理和团队协作效率。

weixin_28836507的博客 326

【Git系列】squash使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 3万+

Git(二) merge squash rebase

创建如上图所示的测试环境,创建master_tag和branchA_tag是为了方便反复测试 1. merge git checkout master git merge branchA 显然 newFile1,newFile2两个文件存在冲突,解决冲突,再次提交后,提交历史如下: git log查看提交记录 合并分支后,提交记录是按照时间先后顺序排列的,bran...

qq_38478903的博客 717

Git使用:Git中代码怎么合并?直接合并(Merge) 和 变基合并(Rebase + Merge)的区别?

Git分支合并的三种主要方法及适用场景: 标准合并(Merge):适合团队协作,保留完整提交历史,生成合并提交,需手动解决冲突后推送。 变基合并(Rebase+Merge):适合线性提交需求,通过变基调整提交顺序后合并,需注意重写历史的风险。 Pull Request/Merge Request:推荐团队使用,结合代码审核,提供多种合并选项(标准/压缩/变基)。 最佳实践:团队协作优先PR/MR,个人项目可选变基,紧急修复用直接合并。冲突解决推荐可视化工具辅助。

浪潮行舟_2136 1795

git rebase

git rebase 还是 merge的使用场景最通俗的解释 - 简书 场景:基于master分支创建一个sub_branch,在开发过程中,master分支随时有进行更新,因此在sub_branch分支编写代码之前进行一次git rebase master,就好像你从公共分支又重新拉出来这个分支一样。 >> git rebase master 随后进行开发后 >> git add . >> git commit -m "xx" >> git pu

huanhuaqian的博客 332

Git分支合并策略:Squash Merge与Rebase Merge的实战解析

本文深入解析Git中Squash Merge与Rebase Merge两种分支合并策略。通过对比其核心原理、操作流程及适用场景,帮助开发者根据团队协作需求,选择合适策略以构建清晰、线性的提交历史,从而提升代码库的可维护性。

weixin_28826961的博客 354

Git 合并代码的不同方式 - Merge Commit、Squash and merge、Cherry-pick、Rebase and merge

我们期望维护一份干净而可用的代码提交历史,不希望某些意义不大或存在歧义的提交记录污染主分支的代码提交历史, 此时我们就应该使用可交互式的 Rebase 压缩或调整代码提交记录。还常用于从不稳定的开发分支(不具备合并到主分支的条件)挑选个别需要紧急发布的安全修复到稳定分支中, 这种场景合并没有意义, 因为合并反而会引入更多不需要的变更。这是团队开发中最为常见的场景: 当其他人将代码合并至远程的 develop 分支后, 你的开发分支将落后于 develop 分支。毋庸置疑, 合并是最通用的代码合并方式。

glovenone的专栏 3744

git中的merge和rebase的区别

都是用于整合分支变更的核心命令,但它们的实现方式和结果有本质区别。通过合理选择合并策略,可以兼顾历史可读性和协作安全性。:如果目标分支是源分支的直接祖先,直接移动指针。将这些提交按顺序应用到目标分支的最新提交后。找到当前分支和目标分支的最近公共祖先。:创建新的合并提交(非快进时)。移动分支指针到新提交链的末端。(需要明确看到合并时间点)。(避免因重写历史导致冲突)。重写公共历史会导致协作混乱。(避免不必要的合并提交)。的更新整合到开发分支)。提取当前分支的差异提交。(清理中间提交,合并。

HL_LOVE_C的博客 1483

蛋白组学/磷酸化蛋白组学分析笔记-2

如何校正蛋白丰度?磷酸化组学质谱下机处理。

weixin_43029125的博客 1374

【git系列】三种合并分支的操作-merge, squash merge & rebase merge

rebase merge是相对来说最优解。可以自行手动选择合并压缩哪些分支(pick 与 fixup),且不会改变commit作者信息,commit提交记录也很清晰。

hwxiaozhi的博客 6276

AutoDock Vina 对接计算(大批量)

AutoDock Vina是一种用于计算生物分子之间相互作用的计算工具,主要用于蛋白质和小分子(通常是潜在药物分子)之间的对接研究。它可以用于虚拟筛选、药物设计和生物分子结合位点的预测等多个应用领域。

MurphyStar的博客 1万+

【git学习】 个人代码版本管理——merge rebase squash

本文介绍了Git版本管理中的分支操作

成为富婆,报效祖国!! 1299

yolov26改进 | Neck/颈部创新篇 | 独创HFPN利用分层特征融合块HFFB模块融合多层次特征改进yolov26(全网独家创新)

本文提出了一种创新的分层特征融合模块HFFB(Hierarchical Feature Fusion Block)来改进YOLOv26的neck部分,构建了名为HFPN的新型特征金字塔网络。该模块通过三分支结构融合局部特征(CNN提取)、全局特征(Swin Transformer提取)和中间特征,并包含空间注意力(SA)、通道注意力(CA)和残差反向MLP(IRMLP)等组件来优化特征融合效果。实验表明,该方法能针对不同尺度目标(大/中/小)进行自适应检测,可根据具体数据集需求选择不同配置。文章详细提供了核

Snu77的博客 485

SpringBoot中使用FastJson解析Json数据

场景 1.SpringBoot默认配置的是Jackson。 2.项目搭建专栏: https://blog.youkuaiyun.com/BADAO_LIUMANG_QIZHI/column/info/35688 实现 引入fastJson的依赖 <!-- fastjson的依赖 --> <dependency> <groupId>com.alibab...

BADAO_LIUMANG_QIZHI的博客 4140

Squash Merge(压缩合并)和Rebase Merge(变基合并)介绍

将功能分支的提交重新应用到主分支上,最终以线性历史合并。它允许在合并前手动整理提交(如合并、删除、修改提交信息),同时保留原始提交的作者信息。是 Git 中两种常见的分支合并方式,它们都旨在简化提交历史或保留更清晰的开发记录,但实现方式和适用场景不同。,然后合并到主分支。这种方式会丢失原始提交的细节,但能保持主分支的提交历史简洁。,可以更好地管理 Git 提交历史,平衡简洁性与可追溯性。将目标分支的所有提交(例如功能分支的多个提交)

Dontla的博客 1723

这个AI工具可以把产品说明书转成演示视频,老板狂喜

回顾本文,我们从“传统视频制作的痛点”出发,拆解了AI将产品说明书转为视频的核心技术(NLP文本理解→CV画面生成→视频合成),并提供了3类工具实操方案(SaaS/开源/API)。推广成本降80%,制作效率提90%,产品迭代与推广终于能“同频”;摆脱对专业团队的依赖,自己就能快速产出高质量视频;对技术爱好者来说,这是一个“AI多模态融合”的绝佳实践案例(NLP+CV+语音合成的综合应用)。今天就找一份产品说明书,用HeyGen或Pictory试做一个视频。

AIGC应用创新大全的博客 323

Nuclide分支合并终极指南:Squash、Merge与Rebase策略全面对比

在现代化的Web和移动应用开发中,**Nuclide作为基于Atom构建的开源IDE**,为开发者提供了强大的版本控制功能。有效的分支合并策略是团队协作中确保代码质量和项目稳定性的关键因素。本文将深入探讨三种主流分支合并方法:squash merge、merge commit和rebase,帮助您选择最适合团队需求的策略。 [![Nuclide构建工具界面](https://raw.gitcod

gitblog_00222的博客 719

华为OD机试真题 新系统 2026-04-19 C语言 实现【8位LED控制器】

有一个8位LED控制器,包含8个LED灯(编号0-7),初始状态全灭,用8位二进制表示为:00000000。控制器可以接收以下三种指令: Lx:L表示点亮操作,x表示LED的编号(0一7),操作得到的结果是:点亮第x个LED灯,把状态设为1。 Dx:D表示熄灭操作,x表示LED的编号(0-7),操作得到的结果是:熄灭第x个LED灯,把状态设为0。 Tx:T表示切换操作,x表示LED的编号(0-7),操作得到的结果是:切换第x个LED灯的状态,若状态为0则变为1,为1则变为0。 现在给定一组指令字符串(0<

MISAYAONE的博客 149

智能家居系统设计:基于MATLAB的智能家居系统设计和仿真,包括智能家居控制、家庭能源管理和家庭安全监控

基于 MATLAB 的智能家居系统设计方法可以有效地解决各类智能家居问题。

走向CTO的路上... 1775

Git合并大法:Squash Merge和Rebase Merge实战对比(附避坑指南)

本文深入对比了Git中的Squash Merge和Rebase Merge两种合并策略,通过实战操作流程和场景化选择指南,帮助开发者高效管理分支合并。文章详细解析了两种策略的核心区别、适用场景及避坑技巧,特别适合团队协作中需要优化提交历史的开发者。

spice的博客 598

基于YOLOv8深度学习的火焰与烟雾检测系统详解:UI界面 + YOLOv8 + 数据集的实现

通过自动化检测火焰和烟雾,可以提高响应速度,减少潜在的火灾损失,保障人身和财产安全。此外,应用还会显示标记了检测框的视频画面,方便用户直观了解检测效果。同时,前端界面将使用Streamlit来实现,因其可以快速搭建交互式应用,适合我们的需求。要训练一个有效的火焰和烟雾检测模型,我们需要一个包含火焰和烟雾图片的数据集。为了保证模型的准确性和泛化能力,建议收集至少500张火焰和烟雾的图片,保证数据的多样性和代表性。训练过程中,模型会输出每个Epoch的训练损失和验证准确率,便于我们监控模型的学习情况。

YOLO 1322

Git分支的合并策略有哪些?Merge和Rebase有什么区别?关于Merge和Rebase的使用建议

Git 中的文件可分为五种状态: untrack(未追踪):未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制。 通过git add状态变为Staged; unmodified(未修改):文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两种去处, 如果它被修改, 而变为Modified。如果使用git rm移出版本库, 则成为Untracked文件; modified(已修改):已修改表示修改了文件,但还没保存到数据库中;

一个写湿的程序猿 2600

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Git merge | rebase的区别以及使用场景

这么久以来不管是更新当前分支代码,还是合并代码,都是使用的merge,但也知道有rebase的操作,就是不理解其究竟有什么区别,且merge用了这么久没出过啥问题,就没深究过rebase。现在抽空出来,研究一下,实际rebase的使用场景还是挺多,而且这些场景下使用rebase的姿势也要比merge正确。 merge与rebase的区别 rebase会把你当前分支的commit放到公共分支的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样。 举例:如果你从mast...

UrasakiNakajima的博客 3677

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: 为什么 AWS 数据库不讲 HTAP
下一篇: 飞越 Flyway!
Bytebase
博客等级 码龄5年 1348粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值