Git——修改历史记录详解

目录

  • Git
    • 1、修改历史信息
      • 1.1、启动互动模式
      • 1.2、修改Commit信息的影响
      • 1.3、取消Rebase
    • 2、多个Commit合并位一个Commit
    • 3、一个Commit拆解成多个Commit
    • 4、在某些Commit之间插入新的Commit
    • 5、删除Commit
    • 6、调整Commit的顺序
    • 7、Revert指令
      • 7.1、取消Commit
      • 7.2、取消Revert
        • 1、再开一个Revert
        • 2、直接使用Reset
    • 8、Reset、Rebase和Revert区别

Git

1、修改历史信息

要修改历史信息,可使用--amend参数来修改最后一次Commit的信息,但这仅限于最后一次,如果要改动其他更早的信息,就得使用其他方法了。

前面介绍过的git rebase指令有一种强大的互动模式,接下来的几节内容都是介绍怎样使用这种模式来改动过去的历史记录。首先看一下当前的状况:

git log --oneline

在这里插入图片描述

1.1、启动互动模式

下面使用Rebase指令整理一下:

git rebase -i 4cb958a

-i参数是指要进入Rebase指令的“互动模式”,而后面的4cb958a是指这次Rebase指令的应用范围为“从现在到4cb958a这个Commit”,也就是最开始的那个Commit。这个指令会弹出一个Vim编辑器:
在这里插入图片描述

这里需注意以下两点:

  1. 上面的顺序与git log指令的结果是相反的,但在SourceTree界面中是一样的。
  2. 上面的pick是指“保留这次的Commit,不做改动”,其他指令稍后会介绍。

修改指令,选取两行把pick改成reword(r):
在这里插入图片描述

存档并离开之后,会立即弹出另一个Vim编辑器画面:
在这里插入图片描述

修改第一个Commit信息,然后保存:
在这里插入图片描述

修改第二个Commit信息,然后保存:
在这里插入图片描述

再次查看历史记录:
在这里插入图片描述

1.2、修改Commit信息的影响

看起来好像只是改了信息,只涉及单纯的文字变动,其实没有那么简单。如果仔细看,就会发现那两次Commit的SHA-1值都变了,这两次的Commit已经是全新的Commit对象了。

进行Rebase时,Commit对象并不是剪切、粘贴而已,因为要接的前一个Commit不同(其实时间也不同),所以会重新计算并做出一个新的Commit对象。

这里也是一样,看起来只是改字,但因为Commit对象的信息也会影响SHA-1的计算,所以Git会做出新的Commit对象来替代原来的Commit对象。

不止这样,因为这两个Commit对象被换掉了,在它之后的Commit因为前面的历史信息被改了,所以后面整串的Commit全部都重做新的Commit对象来替代旧的Commit对象。

1.3、取消Rebase

如果想要取消这次的Rebase,只需这样做:

git reset ORIG_HEAD --hard

2、多个Commit合并位一个Commit

新增两个文件并分两次提交:

echo "111" > 1.txt
echo "222" > 2.txt
git add .
git commit 1.txt -m "add 1"
git commit 2.txt -m "add 2"

查看记录:
在这里插入图片描述

如果把这2个Commit合并为一个,就会让Commit看起来更简洁。可以使用互动模式的Rebase来处理:

git rebase -i d249c0f

在这里插入图片描述

这里使用squash指令,把上面的内容改为:

在这里插入图片描述

上面的改动表示cc722b0这个Commit会和前一个05b8f3eCommit合并在一起。

随后修改合并后的Commit信息:
在这里插入图片描述

再次查看记录,合并成功:在这里插入图片描述

3、一个Commit拆解成多个Commit

继续使用上文中的案例,目的是把51422de这个Commit拆分为2个Commit,每个Commit只有一个文件即可。

git rebase -i d249c0f

在这里插入图片描述

这次把要拆解的那个Commit的pick改成edit:
在这里插入图片描述

保存后,Rebase在执行到51422de这个Commit时就会停下来:

在这里插入图片描述

这时,因为要把当前这个Commit拆解成两个Commit,所以要使用Reset指令:

git reset HEAD^

然后查看一下状态:
在这里插入图片描述

可以看到,1.txt和2.txt都被拆解出来放在工作目录中,且处于Untracked状态。还记得怎么Commit文件吗?就是用add + commit二段式指令:

git add .
git commit 1.txt -m "add 1"
git commit 2.txt -m "add 2"

最后执行

git rebase --continue

以完成rebase交互。

查看记录,完成了拆分:
在这里插入图片描述

4、在某些Commit之间插入新的Commit

还是使用上面案例,在(69204dc)add 2和(e061b15)add 1之间插入一个Commit。

git rebase -i d249c0f

在这里插入图片描述

处于Rebase状态的Commit列表与平常看到的记录是相反的,所以如果想在某两个Commit之间再增加Commit,要注意停下来的那个点是不是正确的点。例如,要加在add 2和add 1之间增加Commit,需要停在add 1上:

在这里插入图片描述

保存后,Rebase操作执行,停在add 1的Commit上:
在这里插入图片描述

此时,就可以新增Commit了:

echo "1.5" > 1.5.txt
git add 1.5.txt
git commit 1.5.txt -m "add 1.5"

随后继续执行Rebase操作:

git rebase --continue

查看记录,插入Commit成功:

在这里插入图片描述

5、删除Commit

继续使用上述案例,删除掉add 1.5这个Commit。

要删除Commit很简单,在Rebase的过程中,把原来的pick改成drop,甚至直接将其删掉也可以。

git rebase -i d249c0f

在这里插入图片描述

如果想删掉add 1.5,可以把该行的pick改成drop,或者直接删除掉该行:
在这里插入图片描述

存档、离开后便会开始进行Rebase。然后查看记录,删除成功:
在这里插入图片描述

6、调整Commit的顺序

继续使用上述案例,假设先在要互换add 1和add 2这两个Commit的顺序。

git rebase -i d249c0f

在这里插入图片描述

只需要互换两个记录的顺序即可:
在这里插入图片描述

存档、离开后,Rebase就会继续做它的工作。然后查看记录,顺序已经调整成功:

在这里插入图片描述

7、Revert指令

7.1、取消Commit

继续使用上文案例,假设要取消最后的add 1这个Commit。

git revert HEAD --no-edit

在这里插入图片描述

这样就把最后一次Commit的内容删掉了。虽然文件不见了,但是Commit增加了。

Revert指令是“再做一个新的Commit,来取消你不要的Commit”,所以Commit的数量才会增加。

7.2、取消Revert

如果做出来的Revert不想要了,可用以下几种方式来处理:

1、再开一个Revert

可以再开一个新的Revert,来Revert刚才那个Revert:

git revert HEAD --no-edit

在这里插入图片描述

刚刚被删掉的1.txt又出现了,这样Commit又变多了。

2、直接使用Reset

如果要“砍掉”这个Revert,只需直接使用Reset指令:

git reset HEAD^ --hard

8、Reset、Rebase和Revert区别

指令修改历史记录说明
Reset把当前状态设置成某个指定Commit的状态,通常适用于尚未推出去的Commit
Rebase不管是新增、改动、删除Commit,还是用来整理、编辑还没有推出去的Commit,都相当方便,但通常只适用于尚未推出去的Commit
Revert新增一个Commit来反转(或说取消)另一个Commit的内容,原来的Commit依旧会保留在历史记录中。虽然会因此而增加Commit数量,但通常比较适用于已经推出去的Commit,或者不允许使用Reset或Rebase来修改历史记录指令的情景

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【金三银四】掌趣科技24.3.7 H项目 服务端开发笔试题

考试题型: 不定项选择题 10 道 , 填空题 10 道 , 问答题 2 道 , 编程题 4 道 目录 不定项选择题 10 道填空题 10 道问答题 2 道编程题 4 道 不定项选择题 10 道 在TCP协议中,发送方的窗口大小是由两个关键因素共同决定…

Java八股文(MyBatis Plus)

Java八股文のMyBatis Plus MyBatis Plus MyBatis Plus MyBatis Plus 是什么?它与 MyBatis 有什么区别? MyBatis Plus 是基于 MyBatis 进行扩展的一款持久层框架,它提供了一系列增强功能,简化了 MyBatis 的使用。 与 MyBatis 相比…

SpringBoot(文件上传功能,阿里云OSS存储,几种配置文件用法)【详解】

目录 一、新增员工 二、文件上传-技术点 1. 文件上传功能 1.客户端上传文件三要素 2 服务端接收文件 Controller接收文件示例 修改允许上传的文件大小 2. 本地存储文件 3. 阿里云OSS存储(这里只写一种,可以用其它的) 1.介绍 2.开通…

力扣L14--- 415.字符串相加(JAVA版)-2024年3月17日

1.题目 2.知识点 注1:你可以使用Integer.parseInt()或Double.parseDouble()等方法将字符串转换为整数或浮点数。 public class Main {public static void main(String[] args) {String str "123";int num Integer.parseInt(str);System.out.println(…

深度序列模型与自然语言处理:基于TensorFlow2实践

目录 写在前面 推荐图书 编辑推荐 内容简介 作者简介 推荐理由 写在最后 写在前面 本期博主给大家推荐一本深度学习的好书,对Python深度学习感兴趣的小伙伴快来看看吧! 推荐图书 《深度序列模型与自然语言处理 基于TensorFlow2实践》 直达链接…

iOS常见崩溃简介

1. 崩溃 多指在移动设备(如iOS、Android设备)中或不可移动设备(如:Windows、Linux等设备), 在打开或使用应用程序时出现的突然退出中断的情况(类似于Windows的应用程序崩溃)。 多表现为&#…

MySQL_数据库图形化界面软件_00000_00001

目录 NavicatSQLyogDBeaverMySQL Workbench可能出现的问题 Navicat 官网地址: 英文:https://www.navicat.com 中文:https://www.navicat.com.cn SQLyog 官网地址: 英文:https://webyog.com DBeaver 官网地址&…

使用 opencv 识别答题卡,生成填涂答案

一般答题卡设计时都在试卷4个角预留4个一样大小的黑块 仅能识别选择题判断题之类的填涂答题的题目,不能识别填空题应用题等其它主观题 使用 opencv 识别试卷图片中所有黑块,再根据黑块大小获取四个角的位置,根据四个黑块位置校正图像 将图…

【Numpy】练习题100道(51-75题)

🌻个人主页:相洋同学 🥇学习在于行动、总结和坚持,共勉! #学习笔记# Git-hub链接 目录 1.题目列表 2.题解 1.题目列表 51. 创建一个表示位置(x,y)和颜色(r,g,b)的结…

chatGLM3+chatchat实现本地知识库

背景 由于客服存在大量的问题为FAQ问题,需要精准回复客户,所以针对此类精准问题,通过自建同量数量库进行回复。 落地方案 通过chatGLM3-6Blangchain-chatchatbge-large-zh实现本地知识库库。 注意:相关介绍和说明请看官网~ 配置要…

【解读】NIST网络安全框架CSF 2.0

2014年,NIST(美国国家标准与技术研究所,类似于中国的工信部)首次发布了网络安全框架CSF(Cybersecurity Framework),十年后,在2024年2月26日发布了重大更新(CSF 2.0)&…

C++初阶:string的使用与STL

目录 1. C标准库与STL2. string是什么3. string的使用3.1 构造与拷贝构造3.2 遍历访问方式3.3 STL中算法操作相关内容3.4 容量相关成员函数3.5 内容修改相关成员函数3.6 string类操作成员函数3.7 string的非成员函数 1. C标准库与STL 编程语言标准库中,有着许多基础…

wps技巧二实现每一行文字后面统一添加数据

效果 操作 查找,输入^p 替换,输入 n m p q^p,测试数据,随意替换成你想要的 结果

MySQL-- B+ 树

一、InnoDB 是如何存储数据的? InnoDB 的数据是按「数据页」为单位来读写的 数据库的 I/O 操作的最小单位是页,InnoDB 数据页的默认大小是 16KB 单个数据页的结构及作用 多个数据页之间的逻辑连接(双向链表),不需要物…

STM32/GD32——FreeRTOS任务管理与相关机制

芯片选型 Ciga Device — GD32F470系列 任务管理 任务处理API 操作 API 动态任务创建 xTaskCreate 任务删除 vTaskDelete 静态任务创建 vTaskCreateStatic 挂起任务 vTaskSuspend 恢复任务 vTaskResume 任务创建 BaseType_t xTaskCreate( TaskFunction_t pxTa…

vulhub中GIT-SHELL 沙盒绕过漏洞复现(CVE-2017-8386)

GIT-SHELL 沙盒绕过(CVE-2017-8386)导致任意文件读取、可能的任意命令执行漏洞。 测试环境 为了不和docker母机的ssh端口冲突,将容器的ssh端口设置成3322。本目录下我生成了一个id_rsa,这是ssh的私钥,连接的时候请指…

固态硬盘有缓存和没缓存有什么区别

固态硬盘(SSD)已经成为现代计算机的重要组成部分,它们提供了比传统机械硬盘更快的读写速度,从而显著提升了操作系统的运行速度和应用程序的加载效率。 其中,缓存(Cache)是固态硬盘中一个重要的…

【SpringCloud】使用Seata实现分布式事务

目录 一、Seata 框架的需求背景二、Seata 事务模式与架构2.1 Seata 组成2.2 Seata 事务模式 三、Seata 实战演示3.1 部署 Seata Server3.1.1 下载 Seata Server3.1.2 更改 Seata Server 配置3.1.3 创建 Seata Server 所需的数据库、数据库表3.1.4 启动 Seata Server 3.2 Seata …

ROS2从入门到精通1-1:详解ROS2话题通信机制与自定义消息

目录 0 专栏介绍1 话题通信模型2 话题模型实现(C)3 话题模型实现(Python)4 自定义消息 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情&a…

【最新版源码】快递平台独立版小程序源码|带cps推广营销流量主+前端

源码介绍: 快递代发快递代寄寄件小程序可以对接易达云洋一级总代 快递小程序,接入云洋/易达物流接口,支持选择快递公司,三通一达,极兔,德邦等,功能成熟 如何收益: 1.对接第三方平台成本大约4…