Git——修改历史记录详解

news2025/1/12 13:12:54

目录

  • 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来修改历史记录指令的情景

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

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

相关文章

9. 综合案例-ATM系统 (1~7节知识综合练习)

ATM系统_综合大练习 今天的任务是对之前所有的学习的知识, 进行一个综合性的大练习. 老师说的好, 键盘敲烂 这个项目我写了大量的注释给大家参考, 如果有同学是跟着我的系列学习的, 一定动手练一练. 下面的代码只要按着敲是可以直接运行起来的, 我也把完整代码上传到了CSDN上…

17.WEB渗透测试--Kali Linux(五)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:16.WEB渗透测试--Kali Linux(四)-CSDN博客 1.ettercap简介与使用…

【技术类-04】python实现docx表格文字和段落文字的“手动换行符(软回车)”变成“段落标记(硬回车)”

作品展示: 背景需求: 把python实现docx表格文字和段落文字的“手动换行符(软回车)”变成“段落标记(硬回车)合并在一起统计数量 【技术类-02】python实现docx段落文字的“手动换行符(软回车&a…

C语言 数据在内存中的存储

目录 前言 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1.练习一 2.2 练习二 2.3 练习三 2.4 练习四 2.5 练习五 2.6 练习六 三、浮点数在内存中的存储 3.1 浮点数存的过程 3.2 浮点数取的过程 总结 前言 数据在内存中根据数据类型有不同的存储方式,今…

ElasticSearch常见用法,看这一篇就够了(文末送书)

2024送书福利正式起航 关注「哪吒编程」,提升Java技能 文末送3本《一本书讲透Elasticsearch:原理、进阶与工程实践》 大家好,我是哪吒。 ElasticSearch是一款由Java开发的开源搜索引擎,它以其出色的实时搜索、稳定可靠、快速安…

PCIE问题定位000:PCIe需要的定位手段

1、PCIe debug环境说明 本文将以PCIe EP用户逻辑举例,描述PCIe可以添加哪些定位手段。 如图所示,PCIe IP作为endpoint与RC对接,用户实现了应用逻辑,与PCIe IP进行交互,交互信号中data格式为TLP报文格式,且…

单链表-合并两个集合的数

bb都在代码里哈哈哈哈 对了这里有个要求&#xff0c;不能破坏原来的链表 #include<iostream> #include<cstring> using namespace std;typedef struct LNode {int data;struct LNode* next; }LinkNode; void Create(LinkNode*& L, int a[], int l)//首先建链…

mongodb查询大全mongo语句-MongoDB语句与MySQL语句对比

mongodb查询大全mongo语句 以前版本官网:https://www.mongodb.com/ 现在版本2021年12月7日官网:https://www.mongodb.com 直通车:https://docs.mongodb.com 一、前言 虽然这些语句在开发当中不会使用,因为springdataMongoDB封装的非常完美了。但是这里的语句思想和关系型…

惯导系统静止初始化方法与代码实现并在gazebo中测试

惯导系统静止初始化方法与代码实现并在gazebo中测试 前言静止初始化方法惯导静止初始化实现代码在gazebo中进行测试 前言 在进行GPS加IMU的组合导航或者Lidar加IMU的组合导航时&#xff0c;用EKF或者ESKF的滤波方法时&#xff0c;需要提前知道惯导的测量噪声、初始零偏、重力方…

Mysql 索引、锁与MVCC等相关知识点

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 索引类型存储方式区分逻辑区分实际使用区分索引失效情况 索引建立规范SQL编写规范exlpain字段解析ACID的原理日志引擎慢SQL整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁&#xff1a…

机器学习——压缩网络作业

文章目录 任务描述介绍知识蒸馏网络设计 Baseline实践 任务描述 网络压缩&#xff1a;使用小模型模拟大模型的预测/准确性。在这个任务中&#xff0c;需要训练一个非常小的模型来完成HW3&#xff0c;即在food-11数据集上进行分类。 介绍 有许多种网络/模型压缩的类型&#xff0…

如何写好Stable Diffusion的prompt

Stable Diffusion是一种强大的文本到图像生成模型&#xff0c;其效果在很大程度上取决于输入的提示词&#xff08;Prompt&#xff09;。以下是一些关于如何编写有效的Stable Diffusion Prompt的秘诀&#xff1a; 明确描述&#xff1a;尽量清晰地描述你想要的图像内容。使用具体…

3.4 bp,si,di寄存器,寻址方式,寄存器总结

汇编语言 1. [bxidata] 我们可以用[bx]来指明一个内存单元我们也可以用[bxidata]来表示一个内存单元&#xff0c;它的偏移地址为bx中的数值加上idata mount c d:masm c: debug r d 2000:1000 e 2000:1000 12 34 56 78 a mov ax,2000 mov ds,ax mov bx,1000 mov ax,[bx] mov c…

训练YOLOv8m时AMP显示v8n

在训练Yolov8模型时&#xff0c;使用AMP&#xff08;Automatic Mixed Precision&#xff09;可以加速训练过程并减少显存的使用。AMP是一种混合精度训练技术&#xff0c;它通过将模型参数的计算转换为低精度&#xff08;如半精度&#xff09;来提高训练速度&#xff0c;同时保持…

llama笔记:官方示例解析 example_chat_completion.py

1 导入库 from typing import List, Optional从typing模块中导入List和Optional。typing模块用于提供类型注解的支持&#xff0c;以帮助明确函数预期接收和返回的数据类型。List用于指定列表类型Optional用于指定一个变量可能是某个类型&#xff0c;也可能是None。 import fir…

Visual Studio 2022下配置 OpenMP 多线程编程环境与运行

目录 一创建项目时选择“创建新项目 -> 空项目 -> 下一步 -> 创建” 二右键“源文件 -> 添加 -> 新建项 -> 添加” 三配置 1. 测试程序&#xff1a; 最开始的时候错误很多&#xff1a; 2.将 “ include "stdafx.h" ” 删掉&#xff0c;添加 “…

4.1_6 文件的基本操作

文章目录 4.1_6 文件的基本操作&#xff08;一&#xff09;创建文件&#xff08;二&#xff09;删除文件&#xff08;三&#xff09;打开文件&#xff08;四&#xff09;关闭文件&#xff08;五&#xff09;读文件&#xff08;六&#xff09;写文件 总结 4.1_6 文件的基本操作 …

uni-app开发特点和开发流程

uni-app是一个基于Vue.js框架的跨平台应用开发框架&#xff0c;通过一套代码可以同时运行在多个平台上&#xff0c;包括iOS、Android、H5等。它采用了基于流布局的页面渲染机制&#xff0c;可以自动适配不同平台的屏幕尺寸和分辨率。uniapp官网&#xff1a;https://uniapp.dclo…

2024-03-17悠然-思源茶社申时茶会有感

悠悠白云里&#xff0c;独住青山客&#xff1b; 然灯松林静&#xff0c;煮茗柴门香&#xff1b; 思归若汾水&#xff0c;无日不悠悠&#xff1b; 源上花初发&#xff0c;公应日日来&#xff1b; 申章写深谊&#xff0c;唯愿长相聚&#xff1b; 时时思己过&#xff0c;刻刻…

图鸟UI发布免费开源、高颜值小程序UI框架

大家好&#xff0c;今天分享的主题是图表统计。图表统计是使用图表和图形来可视化和呈现数据的方法。它通过将数据转化为柱状图、折线图、饼图等形式来展示各种统计指标和趋势。 图表统计可以帮助我们更好地理解和分析数据&#xff0c;发现数据之间的关联和规律&#xff0c;并…