尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Git | 变基操作

Git | 变基操作
📅 发布时间:2026/6/19 13:10:29

基本概念

将当前分支的提交移动到另一个基端base上,从而重新组织提交历史

与merge不同,rebase会创建新提交来替代旧提交,使得提交历史呈现线性结构

适用场景
  • 整理本地提交历史—— 在推送前用rebase整理杂乱的分支提交,使其更清晰
  • 避免不必要的合并提交—— 希望提交历史是线性结构时(如开源项目的PR)
  • 同步上游代码—— 将当前分支基于上游最新代码重新应用更改(如git pull --rebase)
原理
初始状态
  • 初始时,master分支与feature分支均有提交,HEAD当前分支在feature,此时执行指令:

    gitrebase master# feature分支上执行,将当前分支feature变基到目标分支master上
找到共同祖先
  • 找到当前分支feature和目标分支master的最近共同祖先common ancestor,即两个分支分叉处的提交
提取当前分支独有提交
  • 从共同祖先开始,提取当前分支feature之后的所有提交更改,保存为临时补丁

应用提交到目标分支
  • 移动feature分支的指针到master的最新提交(新基端)

    此时feature的提交历史没有指针指向,暂时丢失游离(可以通过git reflog找回)

  • 将之前提取的补丁应用到master新基端,生成新提交(内容相同,提交哈希值不同)

    如果遇到冲突,Git暂停rebase过程,解决冲突后继续

    gitaddgitrebase --continue

对比merge(合并)与rebase(变基)
示意图
  • 变基—— 在当前分支feature执行git rebase master,将feature的提交嫁接到master上,重写历史,保持线性

  • 合并—— 在当前分支feature执行git merge master,将master的提交合并到feature上,生成合并提交,保留历史

关键区别
  • rebase重写历史,merge保留历史
    • rebase让feature的提交看起来基于master的最新提交开发(线性历史)
    • merge会保留分支的分叉和合并记录(非线性的历史)
  • merge会生成新提交,rebase不会
    • merge一定会生成合并提交,即使没有冲突
    • rebase只是重新应用提交,不会额外生成提交
  • rebase更适合本地整理,merge更适合公共分支
    • 如果在开发本地分支,并希望提交历史清晰,用rebase
    • 如果在合并公共分支(如团队协作的develop),用merge更安全

指令介绍

变基分支git rebase
  • 语法

    git rebase [选项] <目标分支>
    参数说明
    -i/--interactive进入交互式变基(可修改提交)
    --continue解决冲突后继续变基
    --abort终止变基,恢复到变基前的状态
    --skip跳过当前提交(冲突无法解决时使用)
    --onto <新基端>将提交移动到另一个基端(复杂变基场景)
    -p/--preserve-merges保留合并提交(默认会丢弃)
    --autostash自动暂存未提交的更改(防止变基失败)
  • 具体示例

    • 基本变基 —— 将当前分支feature变基到目标分支master

      $gitcheckout feature $gitrebase master
      # 初始状态A---B---C(master)\D---E(feature)# 执行 git rebase master 后A---B---C(master)\D'---E'(feature)
    • 交互式变基(修改提交)

      $gitrebase -i HEAD~3# 修改最近3个提交

      进入交互式界面后,可以:

      方法说明方法说明
      pick保留提交(默认)squash合并到前一个提交
      reword修改提交信息drop删除提交
      edit修改提交内容——
      pick 1a2b3c Commit1reword 4d5e6f Commit2squash 7g8h9i Commit3
    • 变基过程中遇到冲突

      $ git add <冲突文件> # 手动解决冲突后添加文件
      $ git rebase --continue # 继续变基
      $gitrebase --abort# 放弃变基
    • 部分提交移动到另一个分支 —— 把当前分支topic(G和H)移动到目标分支main

      gitrebase --onto main feature topic
      # 初始状态A---B---C(main)\D---E---F(feature)\G---H(topic)# 把 topic 分支(G 和 H)移动到 main 分支的最新提交 C 上A---B---C(main)\\\G'---H'(topic)\D---E---F(feature)

变基

相关指令
  • git rebase—— 将当前分支的提交变基到指定分支,重新组织提交历史
场景一:基本变基
  1. 切换分支—— 从master分支切换到feature分支

    $gitcheckout feature
  2. 变基—— 将当前分支feature变基到目标分支master

    $gitrebase master

    效果:

    # 初始状态A---B---C(master)\D---E(feature)# 执行 git rebase master 后A---B---C(master)\D'---E'(feature)
场景二:变基时冲突
  1. 变基时报错

    $gitrebase Auto-merging main.py CONFLICT(content): Merge conflictinmain.py error: could not apply2264188...addfunction_a hint: Resolve all conflicts manually, mark them as resolved with hint:"git add/rm <conflicted_files>",thenrun"git rebase --continue".hint: You can instead skip this commit: run"git rebase --skip".hint: To abort and get back to the state before"git rebase", run"git rebase --abort".Could not apply2264188...addfunction_a

    冲突文件:main.py存在内容冲突

    冲突原因:在变基过程中,提交2264188的修改与当前代码存在冲突

  2. 查看冲突文件—— 输出未合并的路径Unmerged paths

    $gitstatus Unmerged paths:(use"git add <file>..."to mark resolution)both modified: main.py
  3. 手动解决冲突—— 打开main.py,保留正确的代码,并添加到暂存区

    <<<<<<<HEAD 当前分支的代码(HEAD指向的版本)=======要应用的提交代码(2264188的修改)>>>>>>>2264188...addfunction_a
    $gitaddmain.py
  4. 继续变基

    $gitrebase --continue
  5. 放弃变基—— 回到rebase前的状态

    $gitrebase --abort
  6. 跳过当前提交—— 该提交的修改将被丢弃

    $gitrebase --skip
场景三:检测到存在未完成的变基
  1. 检测到存在未完成的变基操作

    fatal: It seems that there is already a rebase-merge directory, and I wonderifyou areinthe middle of another rebase. If that is the case, please trygitrebase(--continue|--abort|--skip)If that is not the case, pleaserm-fr".git/rebase-merge"and run me again. I am stoppingincaseyou still have something valuable there.

    问题原因 ——Git在.git/rebase-merge目录保存未完成的变基状态,可能由于:

    • 之前的git rebase被意外中断(如关闭终端)
    • 冲突未完全解决就停止了操作
    • 系统崩溃或强制退出
  2. 解决方案

    • 继续未完成的变基:git rebase --continue
    • 放弃当前变基:git rebase --abort
    • 跳过当前提交:git rebase --skip
    • 手动清理(仅当确认无价值内容时):rm -fr ".git/rebase-merge"

参考文献

更多内容可以参考以下文章:

  • git rebase 用法详解与工作原理 | Shall We Code?

  • git rebase详解(图解+最简单示例,一次就懂)-CSDN博客

  • 图解 Git 基本命令 merge 和 rebase - Michael翔 - 博客园

  • 图解4种git合并分支方法

相关新闻

  • 基于STM32设计的老人监控系统设计(程序代码+实物+原理图+PCB+论文)
  • dpwsockx.dll损坏丢失找不到 打不开软件问题 免费下载方法
  • 2025知名的美国展会搭建企业TOP5权威推荐:甄选口碑服务商助力出海品牌国际亮相 - mypinpai

最新新闻

  • FanControl:Windows平台专业风扇智能温控的完整解决方案
  • 建构之法阅读笔记5
  • 别被线上虚高报价骗了!广州正规回收认准收的顶,报价即成交价 - 奢侈品回收测评
  • Honey Select 2终极游戏增强补丁:一键解锁完整游戏体验的完整解决方案
  • MC9S12XE Flash操作全解析:从物理原理到Bootloader实战
  • Python自动化抢票终极指南:5分钟掌握大麦网高效抢票技术

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号