【Git原理与使用】版本回退reset 详细介绍、撤销修改、删除文件
目录
一、版本回退 reset
1.1 指令:
1.2 参数说明:
1.3 演示:
二、撤销修改
情况一:对于工作区的代码,还没有 add
情况二:已经 add ,但没有 commit
情况三:已经 add ,并且也 commit 了
三、删除文件
一、版本回退 reset
1.1 指令:
执行 git reset 命令用于回退版本,可以指定退回某⼀次提交的版本。要解释⼀下 "回退" 本质是要将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定:
git reset 命令语法格式为:
git reset [--soft | --mixed | --hard] [HEAD]
1.2 参数说明:
- --mixed 为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。
- --soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
- --hard 参数将暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要用这个命 令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前⼀定要慎重。
我们用一个表格来理解:
| 参数 | 工作区 | 暂存区 | 版本库 |
| --mixed | 不变 | 回退 | 回退 |
| --soft | 不变 | 不变 | 回退 |
| --hard | 回退 | 回退 | 回退 |
HEAD 说明:
- 可直接写成 commit id,表示指定退回的版本
- HEAD表示当前版本
- HEAD^ 上⼀个版本
- HEAD^^ 上上⼀个版本
- 以此类推...
可以使用〜数字表示:
- HEAD~0 表⽰当前版本
- HEAD~1 上⼀个版本
- HEAD^2 上上⼀个版本
- 以此类推...
1.3 演示:
为了方便演示,我们需要做一些准备工作,对ReadMe文件做了三次提交,具体内容如下:
#第一次提交
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ vim ReadMe
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ cat ReadMe
hello git
hello git
aaaaa
bbbbb
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git add .
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git commit -m"ReadMe version1"
[master 771fbc6] ReadMe version11 file changed, 1 insertion(+)#第二次提交
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ vim ReadMe
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ cat ReadMe
hello git
hello git
aaaaa
bbbbb
ccccc
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git add .
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git commit -m"ReadMe version2"
[master e9c0a2d] ReadMe version21 file changed, 1 insertion(+)#第三次提交
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ vim ReadMe
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ cat ReadMe
hello git
hello git
aaaaa
bbbbb
ccccc
ddddd
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git add .
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git commit -m"ReadMe version3"
[master 691a70b] ReadMe version31 file changed, 1 insertion(+)#查看Git信息
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git log --pretty=oneline
691a70bc80bc67c3da14a4f547866559bb78a932 (HEAD -> master) ReadMe version3
e9c0a2d43dbb427bf185fe268e48ddfb3a4f4c4e ReadMe version2
771fbc626fcfea13032326165d60a30d1686a122 ReadMe version1
bec8f39d1c9add6fa68b24cbe58da893297c7df0 modify ReadMe
33d37b6d9be1ff2ab7ef5442615ba08afc048073 add ReadMe
如果我们提交完version3,然后觉得version3的代码写的太烂了,想要基于version2重新编写,此时我们就需要回退到version2,由于我们想让工作区的代码也跟着回退,所以我们需要使用--hard参数
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git reset --hard HEAD^
HEAD is now at e9c0a2d ReadMe version2
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ cat ReadMe
hello git
hello git
aaaaa
bbbbb
ccccc
可以发现,工作区的代码已经回退到version2了,我们再次使用git log 指令,发现HEAD指向了version2了
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git log --pretty=oneline
e9c0a2d43dbb427bf185fe268e48ddfb3a4f4c4e (HEAD -> master) ReadMe version2
771fbc626fcfea13032326165d60a30d1686a122 ReadMe version1
bec8f39d1c9add6fa68b24cbe58da893297c7df0 modify ReadMe
33d37b6d9be1ff2ab7ef5442615ba08afc048073 add ReadMe
到这里回退功能就展示完了,但是如果因为一些原因又需要回退到version3怎么办,但是此时我们用 git log 查不到 version3 的 commit id,那应该怎么回退呢?
如果你的运气好一点在之前使用git log查看时保留了version3的commit id,那你就可以直接恢复到version3,但是如果找不到的话,其实GIt还提供了一个指令 git reflog ,该指令用于查看本地每一个指令的记录
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git reflog
e9c0a2d (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
691a70b HEAD@{1}: reset: moving to 691a70bc80bc67c3da14a4f547866559bb78a932
691a70b HEAD@{4}: commit: ReadMe version3
e9c0a2d (HEAD -> master) HEAD@{5}: commit: ReadMe version2
771fbc6 HEAD@{6}: commit: ReadMe version1
bec8f39 HEAD@{7}: commit: modify ReadMe
33d37b6 HEAD@{8}: commit (initial): add ReadMe
这样我们就可以找到version3的 commit id,虽然这里查看的只是version的部分commit id,但是我们仍然那可以使用这部分id来恢复到version3
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git reset --hard 691a70b
HEAD is now at 691a70b ReadMe version3
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git log --pretty=oneline
691a70bc80bc67c3da14a4f547866559bb78a932 (HEAD -> master) ReadMe version3
e9c0a2d43dbb427bf185fe268e48ddfb3a4f4c4e ReadMe version2
771fbc626fcfea13032326165d60a30d1686a122 ReadMe version1
bec8f39d1c9add6fa68b24cbe58da893297c7df0 modify ReadMe
33d37b6d9be1ff2ab7ef5442615ba08afc048073 add ReadMe
可往往是理想很丰满,现实很骨感。在实际开发中,由于长时间的开发了,导致 commit id 早就找 不到了,可突然某⼀天,我又想回退到 version3,那该如何操作呢?貌似现在不可能了
值得说的是,Git 的版本回退速度非常快,因为 Git 在内部有个指向当前分支(此处是master)的 HEAD 指针, refs/heads/master 文件里保存当前 master 分支的最新 commit id 。当我们在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解成如下示意图:

二、撤销修改
如果我们在我们的⼯作区写了很长时间代码,越写越写不下去,觉得自己写的实在是垃圾,想恢复到上⼀个版本。
情况一:对于工作区的代码,还没有 add
方法1:
首先最简单的方法就是直接删掉多余的代码,但是这个方法很不实用,如果你写了几行代码还好说,如果写了几百行几千行,在手动删除时是很麻烦的,甚至可能修改出bug
方法2:
Git 其实还为我们提供了更好的方式,我们可以使用 git checkout -- [file] 命令让工作区的文件回到最近⼀次 add 或 commit 时的状态。 要注意 git checkout -- [file] 命令中的 -- 很重要,切记不要省略,⼀旦省略,该命令就变为其他意思了,后面我们再说。示例如下:
#到ReadMe文件添加一行代码hello,并没有add 和 commit
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ vim ReadMe
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ cat ReadMe
hello git
hello git
aaaaa
bbbbb
ccccc
ddddd
hello zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git checkout -- ReadMe
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ cat ReadMe
hello git
hello git
aaaaa
bbbbb
ccccc
ddddd
情况二:已经 add ,但没有 commit
add 后数据还是保存到了暂存区呢?怎么撤销呢?
首先使用 git reset --mixed 指令 ,该命令可以将暂存区 的内容退回为指定的版本内容,但工作区文件保持不变。那我们就可以回退下暂存区的内容了!!!
#向ReadMe文件添加一行
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ vim ReadMe
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ cat ReadMe
hello git
hello git
aaaaa
bbbbb
ccccc
ddddd
hello#并且add到暂存区
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git add .#回退
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git reset HEAD ReadMe
Unstaged changes after reset:
M ReadMe#查看当前状态
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified: ReadMeno changes added to commit (use "git add" and/or "git commit -a")
执行完 git reset --mixed 指令后,使用git status指令查看当前的状态,发现此时暂存区中是干净的,只是工作区中存在未add的代码,所以此时的问题就转变为了情况一
#将工作区代码恢复到上一个版本
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git checkout -- ReadMe
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ cat ReadMe
hello git
hello git
aaaaa
bbbbb
ccccc
ddddd
情况三:已经 add ,并且也 commit 了
不要担心,我们可以 git reset --hard HEAD^ 回退到上⼀个版本!不过,这是有条件的,就是 你还没有把自己的本地版本库推送到远程。我们后面会讲到远程 版本库,一旦你推送到远程版本库,你就真的惨了……
#添加一行代码
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ vim ReadMe
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ cat ReadMe
hello git
hello git
aaaaa
bbbbb
ccccc
ddddd
hello#add并且commit
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git add .
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git commit -m"test"
[master d8b9ba8] test1 file changed, 1 insertion(+)#回退
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git reset --hard HEAD^
HEAD is now at 691a70b ReadMe version3
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ cat ReadMe
hello git
hello git
aaaaa
bbbbb
ccccc
ddddd
三、删除文件
在 Git 中,删除也是⼀个修改操作,我们实战⼀下,如果要删除 file 文件,怎么搞呢?如果你这样 做了:
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ touch file
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git add .
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git commit -m"测试删除"
[master 4d9912b] 测试删除1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 filezyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ rm file
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git status
On branch master
Changes not staged for commit:(use "git add/rm <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)deleted: fileno changes added to commit (use "git add" and/or "git commit -a")
这样删除是有用的,仅仅删除了工作区的文件,如果我们用git status查看,会提示我们哪些文件被删掉了,此时工作区和版本库的文件就不一样了。
如果确实想删除版本库中的文件,这时就需要使用 git rm 将文件从暂存区和工作区中删除,并且 commit :
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git rm file
rm 'file'
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git commit -m"delete file"
[master fb025b3] delete file1 file changed, 0 insertions(+), 0 deletions(-)delete mode 100644 file
zyq@iZm5egpp4a85g2tfliaeikZ:~/gitcode$ git status
On branch master
nothing to commit, working tree clean
这样一个文件就删除了
相关文章:
【Git原理与使用】版本回退reset 详细介绍、撤销修改、删除文件
目录 一、版本回退 reset 1.1 指令: 1.2 参数说明: 1.3 演示: 二、撤销修改 情况一:对于工作区的代码,还没有 add 情况二:已经 add ,但没有 commit 情况三:已经 add &…...
反规范化带来的数据不一致问题的解决方案
在数据库设计中,规范化(Normalization)和反规范化(Denormalization)是两个相互对立但又不可或缺的概念。规范化旨在消除数据冗余,确保数据的一致性和准确性,但可能会降低查询效率。相反…...
【Android】直接使用binder的transact来代替aidl接口
aidl提供了binder调用的封装,有的时候,比如: 1. 懒得使用aidl生成的接口文件(确实是懒,Android studio中aidl生成接口文件很方便) 2. 服务端的提供者只公开了部分接口出来,只给了调用编号和参…...
Python机器学习笔记(十八、交互特征与多项式特征)
添加原始数据的交互特征(interaction feature)和多项式特征(polynomial feature)可以丰富特征表示,特别是对于线性模型。这种特征工程可以用统计建模和许多实际的机器学习应用中。 上一次学习:线性模型对w…...
《跟我学Spring Boot开发》系列文章索引❤(2025.01.09更新)
章节文章名备注第1节Spring Boot(1)基于Eclipse搭建Spring Boot开发环境环境搭建第2节Spring Boot(2)解决Maven下载依赖缓慢的问题给火车头提提速第3节Spring Boot(3)教你手工搭建Spring Boot项目纯手工玩法…...
【AI进化论】 如何让AI帮我们写一个项目系列:将Mysql生成md文档
一、python脚本 下面给出一个简易 Python 脚本示例,演示如何自动获取所有表的结构,并生成一份 Markdown 文件。你可根据自己的需求做修改或使用其他编程语言。 import mysql.connector# ------------------------ # 1. 连接数据库 # -----------------…...
(已开源-AAAI25) RCTrans:雷达相机融合3D目标检测模型
在雷达相机融合三维目标检测中,雷达点云稀疏、噪声较大,在相机雷达融合过程中提出了很多挑战。为了解决这个问题,我们引入了一种新的基于query的检测方法 Radar-Camera Transformer (RCTrans)。具体来说: 首先设计了一个雷达稠密…...
Elasticsearch:在 HNSW 中提前终止以实现更快的近似 KNN 搜索
作者:来自 Elastic Tommaso Teofili 了解如何使用智能提前终止策略让 HNSW 加快 KNN 搜索速度。 在高维空间中高效地找到最近邻的挑战是向量搜索中最重要的挑战之一,特别是当数据集规模增长时。正如我们之前的博客文章中所讨论的,当数据集规模…...
unittest VS pytest
以下是 unittest 和 pytest 框架的对比表格: 特性unittestpytest设计理念基于类的设计,类似于 Java 的 JUnit更简洁,基于函数式编程设计,支持类和函数两种方式测试编写需要继承 unittest.TestCase 类,方法以 test_ 开…...
Tableau数据可视化与仪表盘搭建-基础图表制作
目录 对比分析:比大小 柱状图 条形图 数据钻取 筛选器 热力图 气泡图 变化分析:看趋势 折线图 预测 面积图 关系分布:看位置 散点图 直方图 地图 构成分析:看占比 饼图 树地图 堆积图 对比分析:比大…...
Center Loss 和 ArcFace Loss 笔记
一、Center Loss 1. 定义 Center Loss 旨在最小化类内特征的离散程度,通过约束样本特征与其类别中心之间的距离,提高类内特征的聚合性。 2. 公式 对于样本 xi 和其类别yi,Center Loss 的公式为: xi: 当前样本的特征向量&…...
3125: 【入门】求1/1+1/2+2/3+3/5+5/8+8/13+13/21……的前n项的和
文章目录 题目描述输入输出样例输入样例输出 题目描述 求1/11/22/33/55/88/1313/2121/34……的前n项的和。 输入 第1行:一个整数n(1 < n < 30 )。 输出 一行:一个小数,即前n项之和(保留3位小数&…...
如何确保获取的淘宝详情页数据的准确性和时效性?
要确保获取的淘宝详情页数据的准确性和时效性,可从以下几个方面着手: 合法合规获取数据 遵守平台规则:在获取淘宝详情页数据之前,务必仔细阅读并严格遵守淘宝平台的使用协议和相关规定。明确哪些数据可以获取、以何种方式获取以及…...
云计算是如何帮助企业实现高可用性的
想象一下,你正在享受一个悠闲的周末,突然接到同事的电话:公司的核心系统宕机了!这个场景对很多IT从业者来说并不陌生。但在云计算时代,这样的噩梦正在逐渐远去。 一位前辈告诉我:"在技术世界里&#…...
143.《python中使用pymongo》
文章目录 pymongo安装pymongo连接数据库mongodb操作创建数据库判断数据库是否存在创建集合判断集合是否已经存在插入集合插入一条多条插入 查询数据查询一条数据查询所有数据查询指定字段的数据统计查询统计所有记录数按条件统计记录数分页列表查询比较查询$eq$gt$gte$in$lt$lt…...
Babylon.js 的 Mesh 与 Unity 的 GameObject:深入对比与分析
在 3D 开发领域,Babylon.js 和 Unity 是两款极具影响力的引擎,分别在 Web 平台和游戏开发领域占据重要地位。要深入理解这两款引擎的异同,从其核心对象——Babylon.js 的 Mesh 和 Unity 的 GameObject ——入手进行对比,是…...
MySQL安装,配置教程
一、Linux在线yum仓库安装 打开MySQL官方首页,链接为:https://www.mysql.com/ 界面如下: 在该页面中找到【DOWNOADS】选项卡,点击进入下载页面。 在下载界面中,可以看到不同版本的下载链接,这里选择【My…...
Android折叠屏适配(权宜之计)
现在折叠屏手机出了也有一段时间了,但是除了大厂app,其他app适配折叠屏还是比较少,如果真的想做好折叠屏完全适配,那这个文章可能并不适合,这里只是一个简单适配的思路。 如果原先你的app已经适配了平板,那…...
Spark是什么?Flink和Spark区别
Spark是什么?Flink和Spark区别 一、Spark二、Spark和Flink区别三、总结 一、Spark Apache Spark 是一个开源的大数据处理框架,主要用于大规模数据处理和分析。它支持多种数据处理模式,包括批处理、流处理、SQL 查询、机器学习和图处理等。 核…...
Cocos Creator 3.8 修改纹理像素值
修改的代码: import { _decorator, Component, RenderTexture, Sprite, Texture2D, ImageAsset, SpriteFrame, Vec2, gfx, director, log, math, v2 } from cc;const { ccclass, property } _decorator;ccclass(GradientTransparency) export class GradientTrans…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
