【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…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...