第 14 期 2026 年 8 月 广东

搜索
我的生活点滴

技术笔记与学习备忘

2026-06-28 工具 约 11 分钟 陈予安

一次把 Git rebase 讲清楚,给已经会 commit 的人

rebase 做的事情很具体:把你的提交一个个接到另一条历史上。它不是更高级的 merge,只是历史形状不同。

钢笔与摊开的笔记本

什么时候用

只在自己的功能分支上 rebase 到最新的 main。目的是让审查的人看到一条干净的提交链,而不是“合并 main”的额外提交。

已经推到多人共用的分支,不要 rebase。别人基于旧哈希的工作会全部错位。这种情况用 merge。

我自己的习惯:本地整理用 git rebase -i main,把“修 typo”“再修 typo”压成一条。推过但只有我一个人在用的分支,可以用 --force-with-lease,不要用 --force

冲突时先 abort

冲突不是考试。看不清就 git rebase --abort,仓库回到 rebase 之前。再决定是逐个解决,还是先 merge 一次 main 把大冲突消化掉。

解决冲突后是 git addgit rebase --continue。不要在 rebase 中途再开一个新的 commit 当补丁,历史会更乱。

如果同一文件在多个提交里都改过,冲突会反复出现。这是交互式 rebase 该先 squash 的信号。

弄乱了用 reflog

rebase 改的是当前分支指针。旧提交还在 reflog 里,默认留大约两周:

git reflog
git reset --hard HEAD@{3}

先看 reflog 的说明,确认那一条是 rebase 开始前的位置,再 reset。不要凭感觉选哈希。

会 abort 和会 reflog,比会写出“完美历史”更重要。

官方说明见 git-rebase