Workflows

Squash Merge 与 Rebase Merge 选择教程

比较两种常见合并策略对历史可读性、追踪性和回滚方式的影响。

适合谁看
  • 要把命令组合成稳定流程的团队成员
  • 需要处理协作顺序和分支边界的人
前置知识
  • 知道 fetch / pull / push / branch 的基本作用
  • 能理解一条分支为什么会分叉
常见风险
  • 照抄流程却没确认当前分支关系
  • 在共享分支上用错整合方式

为什么这个选择值得单独讨论

Squash Merge vs Rebase MergeSquash merge 将所有提交压缩为一个,历史简洁但丢失提交细节。Rebase merge 保持线性历史且保留每个提交,但会改变提交 ID。
功能分支 (多个提交)
main
ABC
feature
BDE
合并到主线后
main
ABCM
feature
BDEM

很多团队真正卡住的不是“能不能合并”,而是“合并后历史要长成什么样”。

squash mergerebase merge 都能让主线保持相对线性,但它们保留的信息完全不同:

  • squash merge:压成一个提交进入主线
  • rebase merge:保留原来的提交粒度,只是换一个线性基底

所以这不是单纯的 UI 选项,而是团队历史策略。

先看团队到底要保留什么

如果更看重主线简洁

那 squash merge 往往更合适,因为:

  • 主线提交更少
  • 每个 PR 对应一个主线提交
  • 回滚一个 PR 往往更直接

如果更看重过程可追踪

那 rebase merge 更有价值,因为:

  • 原提交粒度还在
  • 能保留更细的演进线索
  • 以后排障时更容易追到中间步骤

推荐的判断顺序

  1. 先看团队是否需要保留原提交粒度
  2. 再看发布、回滚、排障是否依赖 merge 后的结构
  3. 最后统一平台默认策略,不要每个人随意切换

什么时候更适合 squash merge

通常这些情况更适合 squash:

  • PR 内提交很多,但大多只是中间过程
  • 团队希望主线尽量短而清晰
  • 回滚主要按“整组功能”而不是按中间提交进行

什么时候更适合 rebase merge

通常这些情况更适合 rebase merge:

  • 分支里的提交本身就写得很干净
  • 需要保留更完整的变更演进
  • 团队会频繁按单个提交定位、回移或分析问题

一个实操上的判断问题

在合并前,先问自己:

“这个分支里的每个提交,都值得未来继续保留和阅读吗?”

如果答案是否定的,squash 往往更合适。
如果答案是肯定的,rebase merge 往往更有价值。

常见误区

误区 1:squash 一定更高级

不是。它只是更适合某些团队目标。

误区 2:rebase merge 一定更干净

前提是分支里的提交本身已经干净。如果一条分支里全是噪声提交,保留下来也不会自动变好。

误区 3:平台默认选项就等于团队最佳实践

默认值只是起点,真正重要的是团队是否已经统一理解和使用。

特殊情况

  • 如果团队经常按 PR 回滚,squash merge 的操作心智会更简单
  • 如果团队经常按提交回移修复,rebase merge 更容易保留所需粒度
  • 如果平台支持 merge queue 或自动线性化,也要一起考虑历史策略

相关命令

  • git merge
  • git rebase
  • git log
  • git revert
  • git cherry-pick

接下来建议继续学什么

这一页之后,适合继续看:

  1. feature branch collaboration
  2. sync before review
  3. backport with cherry-pick