如何把某个历史提交拆分成多个提交
拆分历史提交用交互式 rebase:git rebase -i <目标提交>^,把该条目标记为 edit;暂停后 git reset HEAD^ 打散该提交,分多次 git add -p + git commit,最后 git rebase --continue 完成。
用交互式 rebase 的 edit 暂停:git rebase -i <目标提交>^,把目标提交那行的 pick 改成 edit;rebase 停在该提交后,git reset HEAD^ 把它的改动打散回工作区,然后分多轮 git add + git commit 重新提交,最后 git rebase --continue 收尾。
完整流程
# 1. 从目标提交的父提交开始交互式 rebase
git rebase -i a1b2c3d^ # a1b2c3d 是要拆的提交
# 2. 编辑器里把那行改成:
# edit a1b2c3d 一个塞了太多东西的提交
# 3. rebase 暂停后,打散这个提交(改动回到工作区)
git reset HEAD^
# 4. 分批重新提交
git add src/login.js
git commit -m "实现登录接口"
git add src/login.test.js
git commit -m "登录接口的测试"
git add -p # 同文件里的部分改动可用交互暂存细分
# 5. 继续完成 rebase
git rebase --continue
已推送的分支
拆分改写了历史,推送需要 git push --force-with-lease。共享分支(main、正在协作的分支)不要拆;PR 未合并的个人分支随意。
常见问题(FAQ)
Q:拆分时报冲突怎么办?
git status 查看冲突文件,解决后 git add,然后 git rebase --continue。想放弃整个操作:git rebase --abort 回到一切开始前。
Q:最新一次提交要拆,有更简单的办法吗?
有:git reset HEAD^ 直接打散,分批重新提交即可,不用 rebase。
Q:拆分后提交信息能重新写吗?
每次 git commit 都是新信息;想改拆分前的原始信息,在 rebase 列表里把对应条目标 reword。