自学教程 学编程从这里开始

git rebase

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 commit
  • reword:修改提交备注 / edit commit message
  • edit:停下来修改代码(可以增删文件)/ stop for amending
  • squash:合并到上一条提交,备注合并 / squash into previous commit
  • fixup:合并到上一条提交,丢弃当前这条备注 / squash, discard this message
  • drop:直接删掉这条提交 / 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 mergegit rebase
历史形态保留分叉,新增 merge 提交线性笔直历史,重写提交
是否改写历史❌ 不改写✅ 改写历史
远程公共分支✅ 安全❌ 禁止
冲突时机合并时一次性冲突逐个提交依次冲突
适用场景公共分支合并、多人协作本地私有分支整理提交、同步上游

四大命令汇总(reset / revert / cherry-pick / rebase)

命令作用改写历史公共远程分支
reset移动指针,丢弃后续提交✅❌ 不推荐
revert新增反向提交抵消改动❌✅ 推荐
cherry-pick复制单个/多个提交到当前分支❌✅(仅少量补丁)
rebase把一串提交移植到新基点,整理历史✅❌ 禁止

高频坑点

  1. rebase 之后如果已经推过远程,再推送需要 -f 强推:git push -f,公共分支绝对不要强推。
  2. 不要 rebase 别人正在开发的分支,会造成对方仓库历史错乱。
  3. squash 适合把零散小提交整理成一个完整功能提交,提交前美化历史。
  4. rebase 是依次重新应用每一个提交,前面提交冲突解决完,才会处理下一个。

一句话速记

  • merge:两条河汇成一条,留下交汇记录
  • rebase:把你自己的补丁拆下来,贴到别人最新代码后面,拉直历史
标签:

0 条笔记