在 macos 上用 git 变基整理提交历史的核心是 git rebase -i,适用于本地未推送的提交,可合并、修改、拆分或删除提交以使历史线性清晰;但已推送的提交禁止变基,否则需强制推送且风险极高。
在 macos 上用 git 变基(rebase)整理提交历史,核心是用 git rebase -i 交互式编辑本地未推送的提交。它不改变代码功能,只让历史变干净、线性、易读——前提是这些提交还没推送到共享远程分支。
什么时候该用 rebase
适合以下三种本地场景:
- 你刚在 feature 分支上连续提交了 5 次,想合并成 1 个语义清晰的提交再推送到远程
- 你的开发分支(如
feat/login)落后于main几个提交,想把本地改动“挪”到最新main顶端,避免后续 merge 产生多余合并节点 - 你发现某次提交消息写错了、漏加文件、或想拆分一个过大的提交,而这些提交尚未
git push
基础操作:合并最近 3 次提交
打开终端,进入项目目录后执行:
git rebase -i HEAD~3
这会打开默认编辑器(通常是 Vim),显示类似这样的内容:
pick abc1234 Add login form<br>pick def5678 Fix input validation<br>pick ghi9012 Update tests
把后两行开头的 pick 改成 squash(或简写 s),保存退出:
pick abc1234 Add login form<br>squash def5678 Fix input validation<br>squash ghi9012 Update tests
接着 Git 会弹出新窗口,让你编辑合并后的提交信息。删掉以 # 开头的注释行,写一句准确概括整体改动的话,比如:feat(login): implement full auth flow with validation and tests
常用指令与安全提醒
在交互式 rebase 编辑界面中,每行开头的指令决定该提交如何处理:
- pick:保留该提交(作为合并目标或独立存在)
-
squash:和前一个
pick合并,并进入编辑器重写提交信息 -
fixup:和前一个
pick合并,但直接丢弃当前提交信息(适合修复 typo、调试日志等次要改动) - reword:仅修改该提交的消息,不碰代码
- drop:彻底删除该提交(慎用)
关键提醒:只要任意一次提交已执行 git push 到远程(哪怕只有你一个人用),就不要再对该范围做 rebase。否则必须用 git push --force-with-lease origin branch-name 强制推送,且要确保没人基于那些旧提交继续工作。
同步主干:把当前分支变基到 main 上
先确保本地 main 是最新的:
git checkout main && git pull
再切回你的分支,执行:
git checkout feat/search && git rebase main
如果过程中出现冲突,Git 会暂停并提示。解决完冲突后,运行 git add .,再执行 git rebase --continue 继续。全部完成后,你的 feat/search 就“长在”最新 main 之上了,后续 git merge 会是快进(fast-forward),无额外合并提交。











