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 复核内容再提交。
忘记手动提交就切换分支,暂存区的改动会跟着跑到目标分支上,提交前务必确认自己站在哪条分支。