首页/开发/Git 与协作速查/git rebase --onto 精确搬移提交
合并变基与冲突71 条

git rebase --onto 精确搬移提交

用 --onto 指定新基线与起点,把一段提交从旧位置搬到新位置;典型用途是把误开在错误分支上的提交摘出来。

Git 与协作速查开发更新于 2026-10-13

rebase --onto 是什么

git rebase --onto 用三个位置参数精确搬移提交:把「旧基点之后、指定分支之前」的那一段提交,重放到新的基线上。它解决的是普通 rebase 覆盖不到的场景,例如特性分支误开在错误的分支上,需要把这批提交整段摘出来接到正确的基线。写法为 git rebase --onto <新基线> <旧基点> <分支>,其中旧基点到分支之间是待搬移的区间。

基本信息

语法git rebase --onto <新基线> <旧基点> <分支>
搬移范围重放 (旧基点, 分支] 区间内的提交
常见场景把误开分支上的提交移接到目标基线
前置先备份分支或用 reflog 兜底
平台任意 Git 客户端

典型使用场景

  • 特性分支误从错误的分支切出,需要接到正确的基线
  • 把一段提交从废弃分支迁移到新分支
  • 调整提交的挂载位置,让历史拓扑更合理
  • 配合 merge-base 精确算出「从哪开始搬」
  • 拆分混乱的分支,把无关提交挪到别处
  • 修复历史后再推送个人分支
  • 把「先提交到主干」的临时提交挪到独立分支

常用示例

常用示例
git switch feature
# 把 feature 上「分叉自 main 之后」的提交搬到 develop
git log --oneline $(git merge-base main feature)..feature  # 先预览
# 把误开分支上的提交移接到目标基线
git rebase --onto develop main feature
git log --oneline --graph -12              # 核对结果

同一条命令的两种写法

同一条命令的两种写法
git rebase --onto develop $(git merge-base main feature)  # 在 feature 分支上执行
git rebase --onto develop main feature                    # 显式指定三个位置参数
先用 git log --oneline <旧基点>..<分支> 预览将被搬移的提交集合,确认条数与内容都对,再执行变基。
范围参数写反会把整条分支历史重放一遍,也可能把不该动的提交搬走;执行前一定预览集合,并保留一个备份分支或记录当前提交号。

执行前后的核对动作

  • git status 确认工作区干净,避免变基被本地改动打断
  • git log --oneline <旧基点>..<分支> 预览待搬移的提交
  • git branch backup/<分支> 留一份备份,出事可直接回退
  • 完成后 git log --oneline --graph 核对拓扑与条数

易错点

  • 三个位置参数顺序写错会重放错误的区间,导致历史大改,必须先用 log 预览再执行
  • 原分支需要保留时先建备份分支,出问题可用 reflog 或备份回退,硬改后找回成本很高
  • 变基产生冲突时处理完要 --continue,中途 --abort 会整体回退到操作前状态
  • 已推送的分支搬移后需要强推,先确认是个人分支并通知协作者
  • 把未提交的改动留在工作区就执行变基,Git 可能拒绝或把改动带进冲突处理,操作前保持工作区干净

数据来源与参考

  • Git 官方文档:git-rebase(--onto)
  • Pro Git 2nd Edition · 3.6 变基
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌