news 2026/4/15 15:07:02

Git | 变基操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Git | 变基操作

基本概念

将当前分支的提交移动到另一个基端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保留历史
    • rebasefeature的提交看起来基于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# 放弃变基
    • 部分提交移动到另一个分支 —— 把当前分支topicGH)移动到目标分支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合并分支方法

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/24 13:07:48

为什么YOLO成为全球工业视觉部署最广泛的模型?

为什么YOLO成为全球工业视觉部署最广泛的模型&#xff1f; 在一条高速运转的SMT贴片生产线上&#xff0c;每1.5秒就有一块PCB板完成元件装配。此时&#xff0c;机器必须在80毫秒内判断成百上千个微型元器件是否存在偏移、漏贴或反向——这不仅是对机械精度的考验&#xff0c;更…

作者头像 李华
网站建设 2026/4/10 15:50:18

diskmgmt.msc文件丢失找不到 下载方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/4/11 0:13:27

YOLOv8 vs YOLOv9:哪个更适合你的项目需求?

YOLOv8 vs YOLOv9&#xff1a;哪个更适合你的项目需求&#xff1f; 在智能摄像头遍布工厂车间、交通路口和物流仓库的今天&#xff0c;一个看似简单的问题却困扰着无数工程师&#xff1a;我该用 YOLOv8 还是 YOLOv9&#xff1f; 这个问题背后&#xff0c;其实是对“快”与“准”…

作者头像 李华
网站建设 2026/4/14 19:36:20

【Java毕设全套源码+文档】基于springboot的商城停车场管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/14 11:43:29

【Java毕设全套源码+文档】基于springboot的零食批发商仓库管理系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华