git rebase
七崽爱吃小饼干2026/03/24阅读 4
Git Rebase
git rebase = 把你的提交「移动」到目标分支的最新位置,让提交历史变成一条干净的直线。
它的作用只有两个:
- 让分支历史变干净、线性、无杂乱合并节点
- 把别人的最新代码同步到你的分支
1. 它和 git merge 有什么区别?
merge(合并)
- 把两个分支揉在一起
- 会产生一个 merge commit(合并节点)
- 历史会变成:分叉 → 合并 → 分叉 → 合并(杂乱)
rebase(变基/重定基底)
- 把你的提交剪切下来,接到目标分支最新版后面
- 不会产生多余的合并记录
- 历史永远是一条干净直线
2. 图解
一、初始状态(rebase 前)
main: A -- B -- C
\
feature: D -- E -- F
- 你从
main的B分出feature - 别人在
main新增了C - 你在
feature写了D、E、F
二、执行 git rebase main 之后
main: A -- B -- C
\
feature: D' -- E' -- F'
变成一条直线:
A -- B -- C -- D' -- E' -- F'
发生了什么?
- 找到共同祖先
B - 把你的
D、E、F暂时“摘下来” - 把
feature指向main最新的C - 把你的提交重新一个个贴上去(变成 D' E' F')
三、对比 git merge
merge 会多一个合并节点:
A -- B -- C -------- M
\ /
D -- E -- F
历史是网状。
rebase 是直线:
A -- B -- C -- D -- E -- F
2. 最常用场景
你在 feature 分支开发,main 分支更新了,你想把最新代码同步过来:
bash
git checkout feature
git rebase main
它做了什么?
- 找到
feature和main的共同祖先 - 暂存你在 feature 上的所有新提交
- 把
feature分支更新到 main 的最新版本 - 再把你的提交一个个重新接上去
最终效果: 你的分支现在完全基于最新的 main!
3. 优点(为什么要用 rebase?)
- 提交历史干净、线性、好看
- 没有乱七八糟的 merge 节点
- 代码冲突更容易解决
- review 代码非常清晰
4. 最重要的黄金规则
- 绝对不要在公共分支(main/develop)上执行 rebase!
- 绝对不要对已经推送到远程、别人也在使用的分支 rebase!
为什么?
rebase 会改写提交历史(改变 commit 的哈希值) 别人拉代码会爆炸,出现大量冲突。
5. 什么时候可以安全用 rebase?
- 只在你自己的私有功能分支使用
- 还没合并到公共分支之前
- 想同步最新主分支代码
- 想整理自己的提交记录(压缩、修改)
6. 最简单的工作流
bash
# 1. 切到你的功能分支
git checkout feature
# 2. 变基到主分支(同步最新代码)
git rebase main
# 3. 如果有冲突 → 解决后
git add .
git rebase --continue
# 4. 全部完成后推送到远程
git push --force-with-lease # 因为历史变了,必须强制推送(仅自己分支可用)
git push --force-with-lease
一、它是干什么的?
你 rebase 之后,本地分支历史被改写了,和远程不一样。
普通 git push 推不上去,Git 会报错。
所以必须强制推送。
但:
git push --force= 暴力覆盖,谁都挡不住(危险!)git push --force-with-lease= 智能安全覆盖(推荐!)
二、--force-with-lease 到底做了什么?
它在强制覆盖之前,先检查一件事:
远程分支,有没有别人提交新代码?
- 如果没有 → 允许你覆盖(安全)
- 如果有 → 拒绝推送,防止你覆盖别人的代码(保护!)
三、用一句话总结
--force-with-lease = 只覆盖你自己的分支,绝不误伤别人的提交
四、和普通 --force 区别(超级关键)
| 命令 | 行为 | 危险度 | 推荐 |
|---|---|---|---|
git push --force | 不管三七二十一,直接覆盖远程 | ⚠️⚠️⚠️ 极高 | 不推荐 |
git push --force-with-lease | 先检查远程是否被别人改动,没动才覆盖 | ✅ 安全 | 必须用这个 |
五、你现在的场景(rebase 后)
你在自己的分支 openclaw 做了 rebase:
- 别人不会动你的分支
- 远程只有你自己提交
所以:
你直接用:
bash
git push --force-with-lease
100% 安全,不会出任何问题!
rebase 之后 → 不能 pull → 直接 push --force-with-lease
7. 总结
- merge = 合并,保留所有历史,会产生交叉
- rebase = 重定基底,让历史变成直线,更干净
- rebase 只能用在自己分支,不能碰公共分支
- 想让提交干净 → rebase
- 想保留完整历史记录 → merge