提测前用 git rebase -i 重写历史是为了将脏提交整理为可读、可审、可追溯的干净提交序列,前提是尚未推送到远程分支;它能压缩调试提交、调整顺序、修正信息、删除临时内容,但仅限首次推送前操作。

提测前用 git rebase -i 重写历史,不是“炫技”,而是把一堆脏提交变成可读、可审、可追溯的干净序列——但前提是:还没推送到远程分支。
提测前为什么要重写历史,而不是直接 merge?
提测(比如向 test 或 staging 分支推送 PR)时,评审者看到的是一长串提交记录。如果里面混着 fix typo、try again、add console.log 这类提交,评审会跳过、质疑、甚至拒绝合并。
而 git rebase -i 能帮你做到:
- 把 5 次调试性提交压缩成 1 个语义清晰的
feat: implement user auth flow - 调整提交顺序,让“建表 → 加字段 → 写校验 → 补测试”符合逻辑流
- 修正错误的提交信息,比如把
update readme改成docs: clarify API rate limit in README.md - 删掉临时注释、调试代码等不该进主干的内容(配合
edit命令)
git rebase -i 的两种典型触发方式
别死记硬背,按场景选:
- 想整理最近 3 次本地提交:
git rebase -i HEAD~3 - 想把当前分支所有未合入
main的提交,基于最新main重放:git checkout feature-x && git rebase -i main
注意:HEAD~N 数的是你当前分支上的提交数,不包括已合并到当前分支的提交;而 rebase -i main 会自动找出两个分支的共同祖先,只重放 feature 分支独有的提交。
监控一个或多个 GitCode 仓库的 PR,通过 OpenClaw Gateway 自动执行 AI 审查,发布 PR 评论,并发送钉钉和企业微信通知。
交互式界面里最常用的 4 个命令
执行 git rebase -i 后,编辑器打开,默认每行一个提交,开头是命令。常用且安全的是这四个:
-
pick:保留该提交,位置可上下拖动来调整顺序 -
reword:保留代码变更,但暂停让你修改提交信息 -
squash:和上一行的pick合并(注意:必须写在要被合并的提交下方) -
drop:整行删掉,相当于丢弃这个提交(慎用,确认没副作用)
别碰 edit 除非你清楚自己在做什么——它会停在那个提交,让你改完代码再 git add + git rebase --continue,容易卡住或误留冲突状态。
最容易被忽略的三个风险点
重写历史本身不难,出问题往往在边界上:
- 只要执行过
git push到远程(哪怕只是origin/feature-x),就不要再rebase——否则得强制推送git push --force-with-lease,队友拉取时会报错或丢失工作 - 如果在
rebase中遇到冲突,解决后必须git add <file></file>,再git rebase --continue;漏掉git add会导致重复提示冲突 -
squash后生成的新提交哈希值和原提交完全不同,CI 构建记录、Git blame 行归属、PR 关联链接都会断开——这不是 bug,是设计如此,提前和测试/运维对齐预期
真正安全的重写窗口,仅限于:本地分支创建后、首次推送前。过了这个点,就该用 git merge 或 git revert 来处理了。










