如何修改历史中的某个特定提交
修改历史提交用交互式 rebase:git rebase -i <目标提交>^,把该行改为 edit;暂停后修改文件并 git commit --amend,然后 git rebase --continue。该提交之后的所有提交哈希都会变。
用交互式 rebase 的 edit 暂停在目标提交上:git rebase -i <目标提交>^(注意 ^ 指其父提交),列表里把该提交的 pick 改成 edit;停下来后改文件、git commit --amend 更新提交,最后 git rebase --continue 走完剩余提交。
完整流程
# 1. 启动交互式 rebase
git rebase -i a1b2c3d^
# 2. 编辑器中把目标行改为 edit
# edit a1b2c3d 要修改的提交
# pick e4f5g6h 后续提交
# 3. 暂停后做修改
vim src/buggy.js
git add src/buggy.js
git commit --amend --no-edit
# 4. 继续
git rebase --continue
注意事项
- 哈希连锁变化:被修改提交之后的所有提交都会得到新哈希——已推送分支需要
--force-with-lease强推,共享分支不要这么干; - 冲突可能:后续提交若依赖被改掉的代码,continue 时会冲突,逐个解决;
- 随时放弃:
git rebase --abort回到操作前。
只想改提交信息?
不用 edit,在 rebase 列表里把该行标 reword(r)即可,不停顿改代码。
常见问题(FAQ)
Q:要改的就是最近一次提交,有更简单的办法吗?
直接 git commit --amend,不需要 rebase。
Q:能改 merge 提交吗?
rebase 默认会"摊平"合并。要保留合并结构用 git rebase -i --rebase-merges,列表会显示 merge 指令块,edit 其中提交。
Q:修改的内容比较多,怕中途出错?
先 git branch backup 打个保险分支。再怎么乱,git reset --hard backup 一键回滚。