Workflows
Squash Merge 与 Rebase Merge 选择教程
比较两种常见合并策略对历史可读性、追踪性和回滚方式的影响。
- 要把命令组合成稳定流程的团队成员
- 需要处理协作顺序和分支边界的人
- 知道 fetch / pull / push / branch 的基本作用
- 能理解一条分支为什么会分叉
- 照抄流程却没确认当前分支关系
- 在共享分支上用错整合方式
为什么这个选择值得单独讨论
功能分支 (多个提交)
main
ABC
feature
BDE
合并到主线后
main
ABCM
feature
BDEM
很多团队真正卡住的不是“能不能合并”,而是“合并后历史要长成什么样”。
squash merge 和 rebase merge 都能让主线保持相对线性,但它们保留的信息完全不同:
- squash merge:压成一个提交进入主线
- rebase merge:保留原来的提交粒度,只是换一个线性基底
所以这不是单纯的 UI 选项,而是团队历史策略。
先看团队到底要保留什么
如果更看重主线简洁
那 squash merge 往往更合适,因为:
- 主线提交更少
- 每个 PR 对应一个主线提交
- 回滚一个 PR 往往更直接
如果更看重过程可追踪
那 rebase merge 更有价值,因为:
- 原提交粒度还在
- 能保留更细的演进线索
- 以后排障时更容易追到中间步骤
推荐的判断顺序
- 先看团队是否需要保留原提交粒度
- 再看发布、回滚、排障是否依赖 merge 后的结构
- 最后统一平台默认策略,不要每个人随意切换
什么时候更适合 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 mergegit rebasegit loggit revertgit cherry-pick
接下来建议继续学什么
这一页之后,适合继续看:
feature branch collaborationsync before reviewbackport with cherry-pick