rebase 最适合解决两个问题:让功能分支跟上主分支,以及在合并前整理自己的提交历史。它会重写提交,因此边界要清楚:只整理自己控制的提交,不改写其他人正在依赖的公共历史。
假设当前在 feature/search 分支,主分支是 main:
git fetch origin
git rebase origin/main
如果出现冲突,先查看状态:
git status
手动修改冲突文件并确认内容正确,然后继续:
git add path/to/file
git rebase --continue
如果发现方向不对,可以随时回到 rebase 之前:
git rebase --abort
在提交较碎时,我会使用交互式 rebase,把“修错字”“补测试”之类的提交合并进对应功能提交:
git rebase -i origin/main
编辑器中保留第一个提交为 pick,把后续相关提交改为 fixup。完成后,历史通常会变成几个目的明确、可以独立审查的提交。
如果这个功能分支已经推送过,rebase 后需要更新远端。使用:
git push --force-with-lease
不要随手使用裸 --force。--force-with-lease 会检查远端是否出现了自己尚未看到的新提交,能避免覆盖同事刚推送的工作。
我的习惯是:开始 rebase 前保证工作区干净;解决冲突后运行测试;推送前再看一遍 git log --oneline --graph。这三个小动作可以省掉大部分返工。