解释一下什么是变基(git rebase)

7 阅读2分钟

变基(git rebase) ,简单说就是:把你当前分支的 commits,“剪下来”,接到目标分支的最新提交后面,让历史变成一条直线

一、一句话定义

  • Merge(合并) :保留分叉,新增一个 “合并提交”,历史是网状。
  • Rebase(变基)重写历史,把你的 commits 一个个 “重放” 到目标分支顶端,历史是一条直线

二、直观例子(看图秒懂)

初始状态:

main:   A → B → C
\
feature:    D → E
  • merge 后(多一个合并提交 M):
main:   A → B → C → M
\         /
feature:    D → E
  • rebase 后(D、E 变成 D'、E',接在 C 后面):
main:   A → B → C
\
feature:        D' → E'

三、它做了什么(原理)

  1. 找到两个分支的最近共同祖先(上例是 B)。
  2. 把你分支(feature)在祖先之后的提交(D、E)存成补丁
  3. 把你分支指针直接移到目标分支(main)最新提交(C)
  4. 把补丁按顺序重新应用,生成新提交 D'、E'(哈希值变了)。

四、优缺点

优点

  • ✅ 历史干净线性,没有多余合并节点,看提交记录很舒服。
  • ✅ 后续合并到主分支时,冲突更少、更清晰

缺点(很重要)

  • ⚠️ 改写历史:旧 commits 的哈希值会变,不要对已经推到远程、别人在用的分支做 rebase,会坑队友。

五、什么时候用 / 不用

  • 适合:自己本地的私有分支(比如 feature、bugfix),推送前整理成线性历史。
  • 禁止:公共分支(main、master、develop)、已经 push 到远程的分支。

六、常用命令

# 1. 切到你的分支
git checkout feature

# 2. 变基到 main
git rebase main

# 3. 冲突了就改文件,然后
git add .
git rebase --continue

# 4. 想放弃变基
git rebase --abort

七、总结

  • merge = 保留分叉,加一个合并节点
  • rebase = 剪掉你的 commits,接到目标分支最前面,历史变直
  • 口诀私有分支用 rebase,公共分支用 merge