今天才知道可以用
git rebase -i <branch>
来将当前分支的多个 commit,合并成1个或者指定几个 commit。
可以使合并到团队主分支时,你的提交历史更清晰。隐藏掉杂乱的 update,tmp 之类的临时提交。
git rebase -i HEAD~n 这个参数 n 数起来太麻烦了吧
绝大多数情况下,你想整理的是“当前分支相对于主分支(main)的所有新增提交”。此时直接用分支名作为参数:
git rebase -i main
原理:Git 会自动找出当前分支与 main 的分叉点,只把分叉点之后的提交列出来。你完全不需要知道有几个,Git 帮你数。
git rebase -i HEAD~n 中的参数 -i 代表什么
-i 是 –interactive(交互式)的缩写。
这个参数是 git rebase 最强大的“灵魂”所在。加上它,Git 会打开一个文本编辑器(比如 Vim、Nano 或 VS Code),让你在真正执行变基之前,手动干预并修改提交列表。
pick squash fixup 的区别
这三个命令的本质区别在于:合并提交时,如何处理被合并的那条“提交说明”(Commit Message)。
为了让你秒懂,我们先假设变基列表里有相邻的两行:
pick A “添加用户登录功能”
pick B “修复登录功能的拼写错误”
现在,你想把 B 合并进 A,看看三种操作的结果:
1. pick(保留)
- 含义:原封不动地保留该提交,什么都不做。
- 代码变化:保留。
- 提交说明:保留。
- 结果:上面两行依然是 两个独立的提交。
2. squash(压缩 + 保留注释)
- 含义:将该提交合并到上一个(即 A)提交中。重点:合并后,Git 会强制弹出编辑器,让你把 A 和 B 的注释混在一起重新编辑。
- 代码变化:B 的改动合并进 A。
- 提交说明:保留 B 的注释(供你手动编辑融合)。
- 结果:变成了 1 个提交。你需要在编辑器里写下类似
feat: 添加登录功能 (修复拼写)的新注释。
3. fixup(压缩 + 丢弃注释)
- 含义:将该提交合并到上一个(即 A)提交中。重点:合并后,Git 直接丢掉 B 的注释,只保留 A 的原始注释,不再弹出编辑器打扰你。
- 代码变化:B 的改动合并进 A。
- 提交说明:彻底丢弃 B 的注释。
- 结果:变成了 1 个提交,且注释依然是
“添加用户登录功能”。
核心差异一览表
| 命令 | 是否合并代码? | 是否弹出编辑器让你改注释? | 最终提交注释来自哪里? |
|---|---|---|---|
| pick | ❌ 不合并,保留独立 | ❌ 不弹出 | 各自保留原样 |
| squash | ✅ 合并到上一个 | ✅ 会弹出 | A + B 融合(需手动整理) |
| fixup | ✅ 合并到上一个 | ❌ 不会弹出(静默执行) | 只保留 A,丢弃 B |
到底什么时候用哪个?(实战选择指南)
- 用
pick:你希望保留每一个开发步骤,按逻辑拆分成多个干净的提交(比如“添加接口”、“添加单元测试”、“添加文档”分开)。
- 用
squash:你写了一个功能,中间有 3 次临时提交(save、tmp、fix bug),但你想重新取一个有意义的最终名字(比如把三个拼成一个叫feat: 大功能上线)。因为 squash 逼你重写注释,能防止你忘记改掉tmp这种烂名字。
- 用
fixup:你刚提交完 A,马上发现有个字母拼错了,紧急补了一个 B(fix typo)。你不需要在合并后的注释里保留“修复拼写”这种废话,直接用fixup,干净的 A 注释就留下来了,效率最高。
💡 进阶小技巧:
如果你确定要把某个提交设为 fixup,甚至不用进编辑器手动改单词。你可以在平时提交时就提前标记:
git commit --fixup A的哈希值
之后执行 git rebase -i main --autosquash,Git 会自动把那个提交标记为 fixup 并排到 A 下面,你只需保存退出,全程不用手敲 squash 或 fixup。需要我展开讲讲这个 --autosquash 的完整配置流程吗?😊
Unlink of file xxx failed
Unlink of file ‘.git/objects/pack/pack-25024388ac3f483813c14bb68efeb3fc9adc1fee.idx’ failed. Should I try again?
大概率是文件被安全软件占用,关闭 vscode,或者重启电脑
git rebase --continue
不要保留多行 message
commit xxx (HEAD -> login)
Author: Zhongwei Sun <zhongwei_sun@xxx>
Date: Wed Jul 15 19:53:52 2026 +0800
替换 logo
英文字体
背景图压缩
最好是编辑修改成一行,或者在 message 里加上 # 注释掉不想保留的内容。
关于作者 🌱
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式