首页/开发/Git 与协作速查/git merge --squash 压缩合并
合并变基与冲突71 条

git merge --squash 压缩合并

把被合并分支的净差异压成一次「已暂存待提交」的改动,不产生合并提交也不记录父子关系,适合把杂乱的临时分支整理后并入。

Git 与协作速查开发更新于 2026-10-13

git merge --squash 是什么

git merge --squash 把被合并分支的净差异压成一次「已暂存待提交」的改动,不生成合并提交,也不记录父子关系。它适合把一条提交很杂的临时分支整理后并入主干:历史里只留一条干净的结果提交,中间过程不入史。

它的代价

因为不建立与源分支的关联,Git 并不知道这次合入来自哪条分支。后续源分支再有新提交,需要重新手动并入;原作者信息也不会进入这次提交,贡献归属可能因此缺失。选择它之前要先接受这两点。

基本信息

适用平台Linux / macOS / Windows(Git 1.7.2 起)
语法git merge --squash <分支>
结果改动进入暂存区,需要手动 commit
历史影响不生成合并提交,不记录父子关系
作者信息以当前提交者为准,不含对方提交历史
适用范围临时分支、提交混乱、只希望留一条结果

典型使用场景

  • 整理临时分支:把「改了又改」的分支压成一条结果提交
  • 保持主干整洁:不希望主干出现大量琐碎提交
  • 保护过程:某些内部变更不适合完整保留演进过程
  • 简化评审:合入主干时只有一条提交,评审更聚焦
  • 组合用法:配合 diff --cached 复核之后再写提交信息

常用示例

常用示例
git switch main
git merge --squash feature/wip     # 差异进入暂存区
git status --short                 # 确认改动已经暂存
git diff --cached --stat           # 核对改动规模
git diff --cached                  # 通读实际会提交的内容
git commit -m 'feat: 合并登录模块改造'

squash 与其他方式

方式是否保留提交是否记录关联
快进合并保留不记录合并点
--no-ff保留记录合并点
--squash不保留不记录分支关联
rebase保留但哈希变化线性,无合并点
squash 不建立与源分支的关联,之后源分支再有后续提交需要再次手动并入;合并前用 diff --cached 复核内容再提交。
忘记手动提交就切换分支,暂存区的改动会跟着跑到目标分支上,提交前务必确认自己站在哪条分支。

易错点

  • squash 之后原作者信息不会进入历史,贡献统计可能不含对方,介意归属时改用保留提交的方式
  • 忘记手动提交就切换分支,暂存改动会跟随到目标分支,提交前先确认当前分支
  • 以为 squash 建立了关联,后续源分支再有新提交时并不会自动合入
  • 压缩之后再想回溯演进过程就找不到了,重要过程应保留在源分支上

数据来源与参考

  • Git 官方文档:git-merge(--squash)
  • GitHub Docs:About merge methods on GitHub(squash merge)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌