什么时候用
只在自己的功能分支上 rebase 到最新的 main。目的是让审查的人看到一条干净的提交链,而不是“合并 main”的额外提交。
已经推到多人共用的分支,不要 rebase。别人基于旧哈希的工作会全部错位。这种情况用 merge。
我自己的习惯:本地整理用 git rebase -i main,把“修 typo”“再修 typo”压成一条。推过但只有我一个人在用的分支,可以用 --force-with-lease,不要用 --force。
冲突时先 abort
冲突不是考试。看不清就 git rebase --abort,仓库回到 rebase 之前。再决定是逐个解决,还是先 merge 一次 main 把大冲突消化掉。
解决冲突后是 git add 再 git rebase --continue。不要在 rebase 中途再开一个新的 commit 当补丁,历史会更乱。
如果同一文件在多个提交里都改过,冲突会反复出现。这是交互式 rebase 该先 squash 的信号。
弄乱了用 reflog
rebase 改的是当前分支指针。旧提交还在 reflog 里,默认留大约两周:
git reflog
git reset --hard HEAD@{3}
先看 reflog 的说明,确认那一条是 rebase 开始前的位置,再 reset。不要凭感觉选哈希。
会 abort 和会 reflog,比会写出“完美历史”更重要。
官方说明见 git-rebase。