当前位置: 首页 > news >正文

【Git 学习笔记】第四章 git rebase 变基操作与相关示例(上)

文章目录

  • 第四章 变基操作及相关案例
    • 4.0 变基简介
    • 4.1 将 `commit` 版本变基到另一分支
    • 4.2 在版本冲突的情况下执行变基
    • 4.3 对指定版本执行交互式变基

第四章 变基操作及相关案例

【相关主题】

  • commit 版本变基到另一分支
  • 在版本冲突的情况下执行变基
  • 对指定版本执行交互式变基
  • 利用交互式变基聚合版本
  • 利用交互式变基变更提交者
  • 自动聚合版本

4.0 变基简介

变基(Rebasing)是 Git 具备的一个异常强大的特性。变基是这样一类操作:假如一个 commit A 最早是基于 commit B 的;那么将 A 变基到 C,就是将 A 变为基于 C 的操作。

在接下来的演示案例中,你会发现变基操作往往并不像看上去那么容易。

4.1 将 commit 版本变基到另一分支

先来看看最简单的一类变基操作。相关准备工作:引入一个新文件、提交、变更内容、再提交。这样本地就有了两次 commit 版本。

还是以 jgit 库为例:

# Clone jgit repo into chapter4
$ git clone https://git.eclipse.org/r/jgit/jgit chapter4
$ cd chapter4
# Checkout a new branch
$ git checkout -b rebaseExample --track origin/stable-3.1
# Create the 1st commit
$ echo "My FishtankGravel, water, plants
Fish, pump, skeleton" > fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Create the 2nd commit
$ echo "mosquitos" >> fishtank.txt
$ git add fishtank.txt
$ git commit -m "Feeding my fish"
# Rabase to stable-3.2
$ git rebase origin/stable-3.2
Successfully rebased and updated refs/heads/rebaseExample.

变基前:

在这里插入图片描述

变基后:

在这里插入图片描述

git rebase 的执行过程:

  1. 找到 HEAD 与变基指向的目标分支之间的公共版本(merge-base);
  2. 基于 merge-base,找出目标分支上所有缺少的版本;
  3. 尝试将缺少的版本逐一应用到目标分支上。

4.2 在版本冲突的情况下执行变基

如果将一个 commit 版本或一个 branch 分支变基到不同的 HEAD 上,很可能会出现版本冲突。此时必须解决完冲突,并运行命令 git rebase --continue,方可完成变基。

本节示例将演示如何在有冲突的情况下完成变基。沿用 4.1 节中演示的最终结果,此时 rebaseExample 分支已经变基到 stable-3.2 分支。示例将从 stable-3.1 重新检出新分支,并添加一个和 rebaseExample 分支同名但内容不容的文本文件 fishtank.txt

# Checkout rebaseExample2
$ git checkout -b rebaseExample2 --track origin/stable-3.1
# Add a new commit
$ echo "My Fishtank
Pirateship, Oister shell
Coconut shell
">fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Rebase conflicting branches
$ git rebase rebaseExample
Auto-merging fishtank.txt
CONFLICT (add/add): Merge conflict in fishtank.txt
error: could not apply 24f9bf1ef... My brand new fishtank2
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "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 apply 24f9bf1ef... My brand new fishtank2
$ subl fishtank.txt

冲突情况如下:

在这里插入图片描述

改为如下内容后保存、关闭:

在这里插入图片描述

添加合并好的文件,继续变基:

$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...

打开的编辑器如图所示:

在这里插入图片描述

确认、保存并关闭,将看到提示变基成功:

$ git rebase --continue
[detached HEAD 9911772b3] My brand new fishtank21 file changed, 2 insertions(+), 3 deletions(-)
Successfully rebased and updated refs/heads/rebaseExample2.
# Check new status via gitk
$ gitk

详情如下:

在这里插入图片描述

可见,本次变基,只将旧分支有、而新分支没有的版本变基过来(即新增 commit)。

在首次变基中断的 git 提示信息中,还能看到两个备选项:

  1. git rebase --abort:如字面含义,中断变基

  2. git rebase --skip:跳过冲突直接变基,这将导致 rebaseExample2 放弃新增的 commit,直接并入 rebaseExample,变基后指向的父级,和 rebaseExample 一致:

    在这里插入图片描述


4.3 对指定版本执行交互式变基

本例以 4.1 中的 rebaseExample 分支为基础,演示如何利用 --interactive 标记,将 4.1 中变基的两个 commit 重新变基到远程跟踪分支 stable-3.1 上:

$ git checkout rebaseExample
Switched to branch 'rebaseExample'
Your branch is ahead of 'origin/stable-3.1' by 109 commits.(use "git push" to publish your local commits)
$ git rebase origin/stable-3.1

此时在新弹出的编辑器中会展示一个 commit 列表,范围是 rebaseExamplestable-3.1 之间的、所有可以变基到 stable-3.1commit 记录。保留示例中新增的两个 commit,其余全部删除(即第 89 行及以前的内容):

在这里插入图片描述

保存后退出编辑器可以看到如下输出:

$ git rebase --interactive origin/stable-3.1
Successfully rebased and updated refs/heads/rebaseExample.
# Check in gitk view:

结果如下:

在这里插入图片描述

示例拓展

本例还可以通过一个命令快速实现既定效果:

$ git rebase --onto origin/stable-3.1 origin/stable-3.2 rebaseExample
Successfully rebased and updated refs/heads/rebaseExample.

变基前后示意图如下:

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 利用OSMnx进行城市路网数据的速度与通行时间推算及分析
  • 【.NET全栈】ASP.NET开发web应用——ASP.NET中的样式、主题和母版页
  • 今天此文堪比出师表最后一句话
  • Redis的中BitMap的应用
  • leetcode算法题(反转链表)
  • CentOS 7 Web面板的文件管理器说明
  • Kotlin Misk Web框架
  • 无人机之机架类型篇
  • AWS云计算实战:电商平台发卡机器人开发指南
  • N-(4-Azido-2-nitrophenyl)-N‘‘-biotinylnorspemidine
  • 在 Android 中定义和使用自定义属性
  • 在VS2017下FFmpeg+SDL编写最简单的视频播放器
  • 科研绘图系列:R语言金字塔图(pyramid plot)
  • Linux上启动和停止jar
  • 【C++】P10287 [GESP样题 七级] 最长不下降子序列 题解_动态规划dp_图论_拓扑排序_洛谷_算法竞赛
  • [译] React v16.8: 含有Hooks的版本
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • extract-text-webpack-plugin用法
  • input的行数自动增减
  • JavaScript类型识别
  • leetcode386. Lexicographical Numbers
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Vue.js 移动端适配之 vw 解决方案
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 大型网站性能监测、分析与优化常见问题QA
  • 将回调地狱按在地上摩擦的Promise
  • 什么是Javascript函数节流?
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 移动端 h5开发相关内容总结(三)
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (2015)JS ES6 必知的十个 特性
  • (C++17) optional的使用
  • (Java)【深基9.例1】选举学生会
  • (笔记)M1使用hombrew安装qemu
  • (动态规划)5. 最长回文子串 java解决
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (三)c52学习之旅-点亮LED灯
  • (三)Honghu Cloud云架构一定时调度平台
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • *Django中的Ajax 纯js的书写样式1
  • .net FrameWork简介,数组,枚举
  • .net 提取注释生成API文档 帮助文档
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET应用架构设计:原则、模式与实践 目录预览
  • @RequestMapping处理请求异常
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [c#基础]DataTable的Select方法
  • [docker] Docker的数据卷、数据卷容器,容器互联
  • [hdu 4552] 怪盗基德的挑战书