git rebase-优雅合并与修改提交

news2024/11/29 11:11:49

文章目录

  • 简介
  • rebase用于合并
  • 使用rebase修改提交
  • cherry-pick

简介

在Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)中我们已经介绍了git的最常用实用的命令。

在上面说的那篇文章中,我们只是简单提了一下rebase。

是因为rebase比较复杂,并且用的相对较少,因为我们通常更喜欢用merge。

但是rebase绝对是有强迫症朋友的福音,尽管rebase非常危险,但是它非常优雅。

能让我们的提交历史看起来简洁清晰。

这一篇我们就来简单感受一下rebase命令的魅力吧。

rebase用于合并

rebase和merge一样,可以用来合并分支。

和merge不同,rebase不会创建一个新的合并节点。

而是把要合并的分支节点依次放在目标合并分支节点的后面。

我们看一下下面这个例子,先看一下基础提交:

基础提交信息

我们先使用merge方式合并代码看看:

git merge feature-a

merge方式合并

我们把merge回退了:

 git reset --hard head^

用rebase来合并:

# 将feature-a rebase到当前分支
git rebase feature-a

# 等价于下面这个命令
git rebase feature-a master

有冲突,解决冲突之后,使用下面命令继续:

# 解决冲突之后add,表示冲突已经解决了,可以继续合并了
git add .
# 然后继续rebase
git rebase --continue

# 当然,我们也可以使用abort参数终止rebase
git rebase --abort

git rebae冲突

rebase合并完成之后的状态:

合并之后状态

对于只有我们自己提交的功能分支,我们就可以使用rebase来合并。

merge合并的步骤:

  1. 将master分支的最新节点MN的快照
  2. feature分支最新节点CN的快照
  3. 与两个分支共同Parent节点MFN的快照执行三路合并生成新的快照
  4. 基于上一步合并之后的快照生成一个连接master分支与feature分支的节点MFN
  5. 将master指向最新合并节点MFN

merge合并示意图

rebase合并步骤:

  1. 找出当前所在分支和变基分支的共同Parent节点,MP
  2. 将feature分支中MP之后节点的快照暂存,如F1、F2、F3…
  3. 将上一步暂存的快照(F1、F2、F3…)应用到master分支,根据时间顺序

使用rebase修改提交

rebase除了用来合并分支,还可以用来修改提交。

命令说明
pick保留该commit,缩写:p
reword保留该commit,需要修改该commit的注释,缩写:r
edit保留该commit, 要修改该提交,和reword不同,edit不仅仅可以修改注释,缩写:e
squash将该commit和前一个commit合并,缩写:s
fixup将该commit和前一个commit合并,但不要保留该提交的注释信息,缩写:f
exec执行shell命令,缩写:x
drop丢弃该commit,缩写:d

我们知道commit --amend可以修改提交,但是,只能修改最后一次,如果要修改多次,怎么办呢?

可以使用rebase。

git commit --amend -m 'commit message'

使用交互模式,修改最近5次提交:

git rebase -i HEAD~5

rebase 交互操作选择
默认是pick表示使用提交,可以对这些commit上下移动从而对提交进行重排序,当退出编辑器时,git会按照指定的顺序去应用提交,并且做出相应的操作。

选择要修改的commit,选择对应的操作

选择rebase操作

根据提示继续操作:

rebase提示

我们根据提示,使用git commit --amend命令继续:

rebase执行完成情况

因为edit不仅仅可以修改提示,还可以修改其他,所以需要我们手动提示继续:

git rebase --continue

rebase squash合并提交

完成:

rebase完成信息提示

我们再看看修改之后的历史信息:

rebase之后的历史信息

cherry-pick

之前文章我们已经介绍过cherry-pick,前面我们了解了rebase,再回过头来看cherry-pick。

可以发现cherry-pick,就是特殊的rebase。

# 首先切到指定分支
git checkout b1
# 查看需要pick哪些提交
git log --oneline

# 切回到pick分支
git checkout master

# cherry-pick指定的commit
git cherry-pick 1f54b01 0fed6dd

# 如果有冲突手动解决冲突,然后add
git add .

# 继续cherry-pick处理commit信息
git cherry-pick --continue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2249709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android蓝牙架构,源文件目录/编译方式学习

Android 版本 发布时间 代号(Codename) Android 1.0 2008年9月23日 无 Android 1.1 2009年2月9日 Petit Four Android 1.5 2009年4月27日 Cupcake Android 1.6 2009年9月15日 Donut Android 2.0 2009年10月26日 Eclair Android 2.1 2…

Qt6.8安卓Android开发环境配置

时隔多年,重拾QtCreator下Android开发。发现Qt6下安卓开发环境配置变简单不少!只需三步即可在QtCreator下进行Android开发: 一、使用Qt Mantenance Tool进行Android模块的安装: 如果感觉安装网速较慢,可以查看本人另外…

PHP获取安卓APK文件的信息(名称、版本、图标文件等)

最近业务需要一个功能,后台上传apk文件,需要自动获取到此apk的名称、版本、图标、PackageName等信息。网上查了很多资料,看大家都是使用aapt工具来获取信息,不过不能获取图标。后来发现有大神已经封装了一套组件【php-apk-parser】…

扫雷-完整源码(C语言实现)

云边有个稻草人-CSDN博客 在学完C语言函数之后,我们就有能力去实现简易版扫雷游戏了(成就感满满),下面是扫雷游戏的源码,快试一试效果如何吧! 在test.c里面进行扫雷游戏的测试,game.h和game.c…

Docker:在 ubuntu 系统上生成和加载 Docker 镜像

本文将介绍在 ubuntu系统上进行 Docker 镜像的生成和加载方法和代码。 文章目录 一、下载和安装 docker二、加载 docker 文件三、保存你的镜像四、将镜像上传到云端并通过连接下载和加载 Docker 镜像五、Docker 容器和本地的文件交互5.1 从容器复制文件到本地宿主机5.1.1 单个文…

【排序算法】之快速排序篇

思想: 分而治之,通过选定某一个元素作为基准值,将序列分为两部分,左边的序列小于基准值,右边的序列大于基准值, 然后再分别将左序列和右序列进行递归排序,直至每部分有序。 性质:这…

Unity中的数学应用 之 角色移动中单位化向量的妙用 (小学难度)

最近准备从简单到困难跟几个教程用以加强自己的业务能力,相信很多小伙伴都做过胡闹厨房这一个案例,其实这个案例比较初级,但是也包含了很多平常可能注意不到小细节,所以我就以它为举例,拓展其中的数学知识 CodeMonkey教…

远程视频验证如何改变商业安全

如今,商业企业面临着无数的安全挑战。尽管企业的形态和规模各不相同——从餐厅、店面和办公楼到工业地产和购物中心——但诸如入室盗窃、盗窃、破坏和人身攻击等威胁让安全主管时刻保持警惕。 虽然传统的监控摄像头网络帮助组织扩大了其态势感知能力,但…

简释下oracle的set define的使用场景

我们在使用oracle的时候,有些菜单表存在url字段,url字段中存在这&字符。但我们通过sql语句进行插入表记录的时候,数据库会提示要我们输入变量值。这个时候有些人难免会不知所措,今天告诉大家一个非常简单的办法解决。 一、问…

在ACK集群中自动化执行Ray Job

企业在管理集群资源时面临的主要挑战是任务量庞大而资源有限。为解决这一问题,需要优先将资源分配给关键部门或个人,并保持高度的灵活性以随时调整资源分配。本文将介绍如何提高企业集群资源的利用率,并通过统一的任务管理平台自动化处理来自…

分布式锁的实现原理

作者:来自 vivo 互联网服务器团队- Xu Yaoming 介绍分布式锁的实现原理。 一、分布式锁概述 分布式锁,顾名思义,就是在分布式环境下使用的锁。众所周知,在并发编程中,我们经常需要借助并发控制工具,如 mu…

【北京迅为】iTOP-4412全能版使用手册-第十九章 搭建和测试TFTP服务器

iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

webrtc 3A移植以及实时处理

文章目录 前言一、交叉编译1.Pulse Audio webrtc-audio-processing2.交叉编译 二、基于alsa进行实时3A处理1.demo源码2.注意项3.效果展示 总结 前言 由于工作需要,硬件3A中的AEC效果实在太差,后面使用SpeexDSP的软3A,效果依旧不是很好&#…

Python学习第十天--处理CSV文件和JSON数据

CSV:简化的电子表格,被保存为纯文本文件 JSON:是一种数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,以JavaScript源代码的形式将信息保存在纯文本文件中 一、csv模块 CSV文件中的每行代表电…

Layui表格的分页下拉框新增“全部”选项

1、首先需要从后端接口获取表格的全部数据长度,这里以100为例。 2、根据请求到的数据进行表格的渲染。示例代码: let pageSize 5 let pageNo 1 let count 100 table.render({elem: XXX,done: function(res, curr, count){pageNo curr; // 将当前选…

CBK7运营安全

1 运营部门的角色 ​ prudent man、due care(按要求执行)VS due diligence(承担管理者责任) ​ 应尽关注:执行了负责任的动作降低了风险。 ​ 应尽职责:采取了所有必要的安全步骤以了解公司或个人的实际风…

AIGC引领金融大模型革命:未来已来

文章目录 金融大模型的应用场景1. **金融风险管理**2. **量化交易**3. **个性化投资建议**4. **金融欺诈检测和预防**5. **智能客户服务** 金融大模型开发面临的挑战应对策略《金融大模型开发基础与实践》亮点内容简介作者简介获取方式 在AIGC(Artificial Intellige…

Linux操作系统2-进程控制3(进程替换,exec相关函数和系统调用)

上篇文章:Linux操作系统2-进程控制2(进程等待,waitpid系统调用,阻塞与非阻塞等待)-CSDN博客 本篇代码Gitee仓库:Linux操作系统-进程的程序替换学习 d0f7bb4 橘子真甜/linux学习 - Gitee.com 本篇重点:进程替换 目录 …

Java函数式编程+Lambda表达式

文章目录 函数式编程介绍纯函数Lambda表达式基础Lambda的引入传统方法1. 顶层类2. 内部类3. 匿名类 Lambda 函数式接口(Functional Interface)1. **函数式接口的定义**示例: 2. **函数式接口与Lambda表达式的关系**关联逻辑:示例&…

DI依赖注入详解

DI依赖注入 声明了一个成员变量(对象)之后,在该对象上面加上注解AutoWired注解,那么在程序运行时,该对象自动在IOC容器中寻找对应的bean对象,并且将其赋值给成员变量,完成依赖注入。 AutoWire…