理解
git rebase
的直白意思是:把一段提交"挪到"另外一个基点上重放(重新应用) ,从而改写历史 、让分支历史变直(线性)。
它到底做了什么?
假设你有:
A --- B --- C (main)
\
D --- E (feature)
在 feature
上执行:
git checkout feature
git rebase main
Git 会把 D、E
这两个提交从原来的基点 B"摘下来" ,再依次应用到 C 的后面:
A --- B --- C -------- D' --- E' (feature)
D'、E'
是"重放"后的新提交(哈希变了),看起来像把feature
"挪到"main
最新位置继续写,从而形成线性历史。
和 merge
的区别
-
merge
:把两条线"合并",产生一个合并提交 ,不改历史。 -
rebase
:把你的提交"搬到"对方后面,改写历史,历史更整洁。
简记:
-
想要干净一条线 :
rebase
-
想要保留真实分叉/合并关系 :
merge
常见用法
-
1、把功能分支移到主分支最新位置
git checkout feature
git fetch origin
git rebase origin/main
然后再合并/推送,减少冲突。
-
2、交互式 rebase(整理历史)
git rebase -i HEAD~5
在弹出的列表里可以:
-
pick
使用-
reword
改提交信息-
squash/fixup
合并多个提交 -
drop
丢弃某次提交 -
edit
暂停在某次提交(常用于"删提交但保留代码":git reset --mixed HEAD^
然后重提)
-
-
-
把某次提交的父链改到别处
git rebase --onto new-base old-base branch
意思是:把 branch
上 从 old-base 之后 的那段提交,搬到 new-base
上。
什么时候用 / 不用
适合:
-
让历史更直(线性历史、易读)。
-
本地分支的提交还没分享给别人(还没 push 或别人没基于它工作)。
-
整理提交(合并、改信息、删除某些提交)。
避免:
-
已经被多人拉取/基于的公共分支(如远程
main
),rebase 会改哈希,会给同事带来同步成本。 -
不熟悉时直接在远端受保护分支上改历史。
推送注意
rebase 改了提交哈希,推送时需要强推:
git push --force-with-lease
(--force-with-lease
比 --force
安全,能避免覆盖别人新提交)
一句话总结
-
rebase = 改基重放:把你的提交"挪"到新的基点上,改写历史,让提交串更直更干净。
-
本地整理历史、跟进主分支最新进展、删除/合并历史提交时,用
git rebase
最合适。 -
改历史要谨慎:公共分支少用,推送用
--force-with-lease
。