什么是 Squash

把多个 commit 合并成一个干净的 commit。就像写了两封信,第一封说”加个功能”,第二封说”把刚加的功能删了”——squash 后变成一封信,只保留最终结果。

适用场景

  • “加了又删”等中间状态 commit 的清理
  • 功能开发完成后,把零散的 WIP commit 合并为一个有意义的 commit
  • PR 合并前整理历史

操作方法

# 回退最近 N 个 commit 到暂存区(代码不变,只是取消 commit)
git reset --soft HEAD~N
 
# 检查暂存区的净效果
git diff --cached --stat
 
# 重新提交为一个 commit
git commit -m "合并后的 commit message"

实际案例

# 原始历史(两个 commit 互相抵消):
# 9362bdc fix(theme): 标题栏颜色跟随主题切换   ← 添加了调用
# 4ca4b91 refactor(theme): 移除无效的方法       ← 又全删了
 
# Squash 为一个:
git reset --soft HEAD~2
git diff --cached --stat
# → 净效果:1 file changed, 1 insertion(+), 61 deletions(-)
git commit -m "refactor(theme): 移除无效的 _apply_title_bar_harmony"
 
# 历史变干净,不留"加了又删"的痕迹

--soft 是关键

git reset --soft 只回退 commit 记录,代码保持在暂存区不变。相比之下 --hard 会丢弃代码改动,--mixed(默认)会把代码放回工作区(未暂存状态)。