git rebase 命令
核心:
git rebase变基,把当前分支一串提交,摘下来,放到目标分支最新提交的后面。
和 merge 对比:merge 是新增一个合并提交,历史分叉;rebase 是重写提交,形成一条笔直线性历史。
⚠️ 重要红线:已经推送到远程、多人共用的分支,禁止 rebase!rebase 会改写提交历史。

基础语法
# 把当前分支,变基到 main 分支
git rebase main
示例流程:
# 初始提交
git checkout main
echo "A" > readme.md
git add . && git commit -m "A"
echo "B" >> readme.md
git add . && git commit -m "B"
# 新建开发分支
git checkout -b feature
echo "C" >> readme.md
git add . && git commit -m "C"
echo "D" >> readme.md
git add . && git commit -m "D"
# main 分支又新增提交 E
git checkout main
echo "E" >> readme.md
git add . && git commit -m "E"
git checkout feature
# 变基:把 C、D 摘下来,接在 E 后面
git rebase main
变基前:
A --- B --- E main
\
C --- D feature
变基后:
A --- B --- E --- C' --- D' feature
C’、D’ 是全新提交,hash 和原来 C、D 不一样,改动内容相同。
交互式变基(最常用:整理提交、合并、修改备注、删除提交)
# 对最近 4 个提交交互式 rebase
git rebase -i HEAD~4
执行后弹出编辑面板:
pick abc123 commit C
pick def456 commit D
pick ghi789 commit E
pick jkl012 commit F
指令说明(中英对照)
pick:保留提交,不改动 / keep this commitreword:修改提交备注 / edit commit messageedit:停下来修改代码(可以增删文件)/ stop for amendingsquash:合并到上一条提交,备注合并 / squash into previous commitfixup:合并到上一条提交,丢弃当前这条备注 / squash, discard this messagedrop:直接删掉这条提交 / remove this commit
保存退出后按流程执行。
冲突处理
rebase 过程遇到冲突,会暂停在当前正在应用的提交:
# 1. 修改冲突文件,解决冲突
# 2. add 文件
git add xxx.txt
# 3. 继续变基
git rebase --continue
# 放弃本次变基,恢复到 rebase 之前状态
git rebase --abort
# 跳过当前冲突提交(谨慎使用)
git rebase --skip
常用参数
# --onto 高级变基:截取一段提交,移植到新基点
git rebase --onto 新基点 旧起点 终点
# 例子:把从 F 之后的提交,放到 main 上
git rebase --onto main F HEAD
# --autosquash 自动整理 fixup 提交
git rebase -i --autosquash HEAD~5
rebase 拉取远程分支(替代 git pull)
# 等价 git pull --rebase
git fetch
git rebase origin/main
优势:不会自动生成 merge 提交,保持本地历史干净;个人私有分支推荐。
rebase vs merge 对比
| 项目 | git merge | git rebase |
|---|---|---|
| 历史形态 | 保留分叉,新增 merge 提交 | 线性笔直历史,重写提交 |
| 是否改写历史 | ❌ 不改写 | ✅ 改写历史 |
| 远程公共分支 | ✅ 安全 | ❌ 禁止 |
| 冲突时机 | 合并时一次性冲突 | 逐个提交依次冲突 |
| 适用场景 | 公共分支合并、多人协作 | 本地私有分支整理提交、同步上游 |
四大命令汇总(reset / revert / cherry-pick / rebase)
| 命令 | 作用 | 改写历史 | 公共远程分支 |
|---|---|---|---|
| reset | 移动指针,丢弃后续提交 | ✅ | ❌ 不推荐 |
| revert | 新增反向提交抵消改动 | ❌ | ✅ 推荐 |
| cherry-pick | 复制单个/多个提交到当前分支 | ❌ | ✅(仅少量补丁) |
| rebase | 把一串提交移植到新基点,整理历史 | ✅ | ❌ 禁止 |
高频坑点
- rebase 之后如果已经推过远程,再推送需要
-f强推:git push -f,公共分支绝对不要强推。 - 不要 rebase 别人正在开发的分支,会造成对方仓库历史错乱。
- squash 适合把零散小提交整理成一个完整功能提交,提交前美化历史。
- rebase 是依次重新应用每一个提交,前面提交冲突解决完,才会处理下一个。
一句话速记
- merge:两条河汇成一条,留下交汇记录
- rebase:把你自己的补丁拆下来,贴到别人最新代码后面,拉直历史
0 条笔记