变基(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'
三、它做了什么(原理)
- 找到两个分支的最近共同祖先(上例是 B)。
- 把你分支(feature)在祖先之后的提交(D、E)存成补丁。
- 把你分支指针直接移到目标分支(main)最新提交(C) 。
- 把补丁按顺序重新应用,生成新提交 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。