创见博客
git rebase
七崽爱吃小饼干2026/03/24阅读 4

Git Rebase

git rebase = 把你的提交「移动」到目标分支的最新位置,让提交历史变成一条干净的直线。

它的作用只有两个:

  1. 让分支历史变干净、线性、无杂乱合并节点
  2. 把别人的最新代码同步到你的分支

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'

发生了什么?

  1. 找到共同祖先 B
  2. 把你的 D、E、F 暂时“摘下来”
  3. 把 feature 指向 main 最新的 C
  4. 把你的提交重新一个个贴上去(变成 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

它做了什么?

  1. 找到 feature 和 main 的共同祖先
  2. 暂存你在 feature 上的所有新提交
  3. 把 feature 分支更新到 main 的最新版本
  4. 再把你的提交一个个重新接上去

最终效果: 你的分支现在完全基于最新的 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
评论
0/100