【Git】修改文件版本回退撤销修改删除文件

news2024/9/20 8:05:13

文章目录

    • 修改文件
    • 版本回退
      • git reset语法规则
      • 注意
    • 撤销修改
      • 情况1:工作区的代码还未add
      • 情况2:工作区的代码已经add 但未commit
      • 情况3:工作区的代码已经add 并且已经 commit
    • 删除文件

修改文件

Git⽐其他版本控制系统设计得优秀,Git跟踪并管理的是修改,不是文件

何为修改?

新增了⼀⾏/删除了⼀⾏/更改了某些字符/删了⼀些⼜加了⼀些/创建⼀个新⽂件 也算修改


比如:将ReadMe⽂件进⾏⼀次修改

image-20230614154405022

那么此时仓库中的ReadMe和我们⼯作区的ReadMe是不同的,可以使用git status查看仓库的状态,查看在你上次提交之后是否有对⽂件进⾏再次修改

image-20230614154458524

上⾯的结果告诉我们,ReadMe被修改过了,但还没有完成添加与提交。⽬前,我们只知道⽂件被修改了,如果能知道具体哪些地⽅被修改了就更好了。

  • 可以使用git diff 文件名命令显示暂存区和工作区文件的差异,显示的格式正是Unix通用的diff格式
  • 也可以使用 git diff HEAD -- 文件名:查看版本库和⼯作区文件的区别

image-20230614154657074


此时git add之后,然后再使用git commit

image-20230614154856026


版本回退

Git能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现之前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能。可以使用git reset命令用于版本回退,可以指定退回某⼀次提交的版本

注意:回退”本质是要将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定 ,也就是说不管使用什么参数,版本库的内容是一定会回退的

git reset语法规则

 git reset [--soft 或者 --mixed 或者 --hard] [HEAD]

--mixed:是默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内容⼯作区⽂件保持不变

--soft:该选项对于⼯作区和暂存区的内容都不变只是将版本库回退到某个指定版本

--hard:该选项将暂存区与⼯作区都退回到指定版本

  • 注意!!!!!:如果⼯作区有未提交的代码时不要使用--hard选项,因为此时工作区会回滚,而没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重

HEAD说明:

  • 可直接写成commit id(版本号),表示指定退回的版本
  • HEAD 表示当前master最新版本

方式1:

  • HEAD^ 表示上⼀个版本

  • HEAD^^ 上上⼀个版本

  • 以此类推…

方式2:

  • HEAD~0表示当前版本
  • HEAD~1表示上⼀个版本
  • 以此类推…

例子:更新3个版本的test文件,并分别进⾏3次提交

image-20230614162528700

查看历史提交记录

image-20230614162332755

假设在提交完version3后,发现version3编写错误,想回退到version2,此时的做法为:

  • 在这⾥希望的是将工作区的内容也回退到到version2版本,所以需要使用--hard选项,

image-20230614163658800

此时test文件的内容已经回退到version2了,再次⽤ git log 查看⼀下提交⽇志,发现 HEAD 指向了version2

image-20230614163803409

但是现在如果我后悔了,想再回到version3怎么办? 此时可以继续使⽤git reset命令回退到version3版本,但是必须要拿到version3的版本号(commit id)去指定回退的版本,但是此时使用git log并不能打印出version3的版本号,运⽓好的话我们可以从终端上去找找之前的记录,运⽓不好的话version3的版本号已经被搞丢了

git提供了一个git reflog命令用户记录本地的每⼀次命令,就可以很方便的找到所有操作记录了

image-20230614164230085

此时这个 4927c33就是version3的版本号的一部分,git回退的时候也可以使用部分的来代表目标版本

image-20230614164430423


注意

Git的版本回退速度非常快,因为Git在内部有个指向当前分⽀master的HEAD指针,在.git目录下的 refs/heads/master文件当中保存当前master分支的最新的版本号(commit id),当我们进行回退版本的时候,Git仅仅是给refs/heads/master存储一个特定的版本号,可以简单理解成如下⽰意图:

image-20230614171335147


撤销修改

例如:如果我们在我们的⼯作区写了很⻓时间代码,越写越写不下去,觉得⾃⼰写的实在是垃圾代码,想恢复到上⼀个版本

情况1:工作区的代码还未add

此时可以直接删掉你⽬前在⼯作区新增的代码。但是可能写了3天⼀直都没有提交代码,此时就很难删除新增的代码,当然了也可以使用git diff filename看看差别再删,但是这样⼜要花3天时间删代码了,并且很⼤的概率还会改出bug

解决办法:可以使用git checkout -- 文件名 命令让⼯作区的对应文件回到最近⼀次add 或者 commit时的状态切记:此时的 --不能丢弃,否则该命令就是其它含义

image-20230614202616044

情况2:工作区的代码已经add 但未commit

工作区的代码已经add到暂存区当中 ==>此时可以使用<font color='blue'>git reset命令进行版本回退,

  • 第一步:将暂存区的内容退回为指定的版本内容,而但⼯作区⽂件保持不变 ==>使用--mixed选项,而--mixed 是默认参数,所以可以省略
  • 第二步:丢弃当前工作区的代码,回到最近⼀次add 或者 commit的状态

第一步:使用git reset --mixed file回退暂存区的版本内容

image-20230614203112093

第二步:使用git check -- 文件名:丢弃该文件在⼯作区中的修改

image-20230614203227980

情况3:工作区的代码已经add 并且已经 commit

此时:可以使用 git reset --hard HEAD^暂存区与⼯作区都回退到上一个版本,而版本库是肯定会回退的。此时HEAD^ :表示上⼀个版本。当然这是有前提的:还没有把本地版本库推送到远程,才能回退到上一个版本。并且使用git reset的时候,版本库是肯定会回退的

image-20230614203606157


image-20230614203922772

删除文件

对工作区的修改包括:在工作区新增, 删除,修改文件

下面例子的前提是: file文件已经add 和 commit,如果一个文件还没有进行add和commit就直接删除,那就不可能恢复了!

例子:删除file文件

直接使用rm删除是没有作用的, git status会⽴刻告诉你哪些⽂件被删除了

image-20230614204054809

此时⼯作区和版本库的内容就不⼀致了,要删文件,除了要删⼯作区的⽂件,还要清除版本库的⽂件。当然了,有两种情况:

  • case1:不小心删除了

此时可以使用git checkout --文件名进行恢复,让⼯作区的对应文件回到最近⼀次add 或者 commit时的状态

image-20230614204236148

  • case2:确实要从版本库中删除该⽂件

使用rm只删除了⼯作区的⽂件,此时可以使用命令:git rm 文件名:将文件从暂存区和工作区中删除,并且执行命令之后还需要再次commit

image-20230614204551261

现在,⽂件就从版本库和暂存区中被删除了

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

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

相关文章

postgresgl数据库的部署与优化

文章目录 一.postgresgl数据库1.postgresgl数据库的概念1.1 PostgreSQL 的核心概念 2.PostgreSQL特点3.PostgreSQL的作用4.PostgreSQL的应用场景5.PostgreSQL、mysql、oracle的对比 二.Linux系统安装PostgresSQL&#xff08;Centos7&#xff09;1.更新yun源2.安装PostgreSQL2.1…

Vue的router学习

,前端路由的核心是什么呢&#xff1f;改变URL&#xff0c;但是页面不进行整体的刷新。 vue-router是基于路由和组件的  路由用于设定访问路径, 将路径和组件映射起来&#xff1b;  在vue-router的单页面应用中, 页面的路径的改变就是组件的切换&#xff1b; 使用router需要…

QT 使用串口

目录 1.1.1 添加库&#xff0c;添加类 1.1.2 定义串口 1.1.3 搜索串口 1.1.4 设置和打开串口 1.1.5 读取数据 1.1.6 发送数据 1.1.7 关闭串口 1.1.1 添加库&#xff0c;添加类 首先&#xff0c;QT5 是自带 QSerialPort(Qt5 封装的串口类)这个类的&#xff0c;使用时…

单相锁相环原理与代码实战解释

单相锁相环程序原理如下图所示 单相锁相环原理 锁相环&#xff08;PLL&#xff09;是一种常用于同步、解调和信号处理等领域的电路或数字算法&#xff0c;其主要作用是将一个输入信号的相位与频率与参考信号进行精确的匹配。这里我们来简单解释一下单相锁相环的原理和分析。 …

自媒体行业下滑的5个标志

我是卢松松&#xff0c;洞察草根行业趋势&#xff01;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 未来大量的自媒体人将面临失业&#xff0c;80%的自媒体人收益没办法养活自己。前两天卢克文说自媒体的发展其实已经到达巅峰期&#xff0c;慢慢开始走下坡路了。我认…

Java集合框架的全面分析和性能增强

Java集合框架的全面分析和性能增强 &#x1f497;摘要&#xff1a;&#x1f497; 1. Java集合框架概述&#x1f497;1.1 Collection接口1.1.1 List接口1.1.2 Set接口1.1.3 Queue接口 &#x1f497;1.2 Map接口 &#x1f497;2. Java集合框架性能优化&#x1f497;2.1 选择合适的…

vue新学习 02 vue命令v-model,数据代理(作用域和作用域链),事件,监听,条件渲染,计算属性(也就是把操作属性的语句放到vue实例中)

双向绑定用命令v-model&#xff1a; v-bind的命令是单项去绑定data中的相关属性&#xff0c;此时的data是真正的data&#xff0c;并没有用变量声明的方式去接收vue实例对象&#xff0c;也就是例如用const vm new Vue({})。而是直接就采用了new Vue&#xff08;{}&#xff09;这…

戴琼海院士——人工智能正深刻地改变这个时代

原创 | 文 BFT机器人 2023世界人工智能大会将继续发挥“科技风向标、应用展示台、产业加速器、治理议事厅”的重要作用&#xff0c;打造“会议论坛、展览展示、评奖赛事、应用体验”四大核心内容&#xff0c;汇聚世界顶级科学家、企业家、政府官员、专家学者、国际组织、投资人…

Ssm+Mysql实现的Java Web酒店管理项目源码附带视频指导运行教程及需求文档

由ssmmysql实现的一款酒店管理系统&#xff0c;该系统实现了酒店客房预订管理的基本功能&#xff0c;还增加了图表显示统计结果的功能有需要的可以联系我分享给大家&#xff0c;下面是运行后的一些截图&#xff1a;

【密码学】四、SM4分组密码算法

SM4分组密码算法 1、概述1.1初始变量算法1.2密钥扩展算法1.3轮函数F1.3.1合成置换T1.3.2S盒 2、算法设计原理2.1非平衡Feistel网络2.2T变换2.2.1非线性变换τ2.2.2线性变换L2.2.3基础置换 2.3密钥扩展算法的设计 1、概述 SM4分组密码算法是一种迭代分组密码算法&#xff0c;采…

使用requests库发送http请求

1. get请求 # 导入requests库 import requests# 此处使用的接口地址为zrlog系统后台登录首页的地址 url "http://172.16.171.129/admin/login"# 通过requests库发送get请求 r requests.get(url url)# 以文本的方式返回响应内容 print(r.text)# 返回HTTP协议状态码…

qssh使用

到官网下载qssh的源码QSsh-botan-1&#xff0c;使用qtcreator打开后&#xff0c;直接编译&#xff0c;即可得到qssh的库 头文件将QSsh-botan-1\src\libs\ssh目录下的.h文件拷到include文件夹下&#xff0c;即为库头文件。 qssh有个问题&#xff0c;如果你将qssh的类放在子线程…

定时发朋友圈怎么设置?

目前微信作为最大的社交平台之一&#xff0c;吸引了众多使用者。你是否听过有些朋友感叹这么多微信号&#xff0c;需要每天手动发布朋友圈&#xff0c;任务很繁琐呢&#xff1f;是否希望可以事先设置好定时发送的功能&#xff0c;让朋友圈自动更新&#xff0c;省去手动发送的麻…

sqlserver row _number函数的运用

sql语句&#xff1a; select dept_id,stcd,row_number() over (partition by dept_id ORDER BY STCD) as 排序 from tb_station_config 这段代码是使用ROW_NUMBER()函数结合窗口函数的语法&#xff0c;用于给结果集中的每一行分配一个唯一的序号。 具体解释如下&#xff1a; R…

uniapp 小程序实时且持续获取定位信息(全局设置一次)(单页面监听定位改变)(不采用定时器)

本篇文章实现了uniapp 微信小程序实时获取定位信息,小程序打开即可持续获取定位信息, 位置更新也会触发相关自定义事件 优点 只设置一次不采用定时器的方式无需多个页面调用单独页面若想获取当前位置是否变化 可单独设置监听,并调用不同逻辑事件 原理: 采用uniapp推出的: un…

基于深度强化学习的DQN模型实现自动玩俄罗斯方块游戏(附详细代码讲解)

一、DQN&#xff08;Deep Q-Network&#xff09;方法概述 DQN&#xff08;Deep Q-Network&#xff09;是一种强化学习方法&#xff0c;通过结合Q-learning算法和深度神经网络来解决强化学习问题。它是深度强化学习的里程碑之一&#xff0c;由DeepMind在2013年提出&#xff0c;被…

【SQL Server】DBCC CHECKDB只是一个数据库维护命令吗?

日期&#xff1a;2023年7月27日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…

【数据仓库】Apache Hive初体验

为什么使用Hive&#xff1f; 使用Hadoop MapReduce直接处理数据所面临的问题&#xff1a; 人员学习成本太高需要掌握ava语言MapReduce实现&#xff0c;复杂查询逻辑开发难度太大&#xff01; 1&#xff0c;使用Hive处理数据的好处操作接口采用类SQL语法&#xff0c;提供快速开发…

MUR2080CT- ASEMI二极管的特性和应用

编辑-Z 本文将详细介绍MUR2080CT二极管的特性和应用。首先&#xff0c;将介绍MUR2080CT二极管的基本结构和工作原理。然后&#xff0c;将探讨MUR2080CT二极管的特性&#xff0c;包括正向电压降、反向漏电流和反向恢复时间等。接下来&#xff0c;将介绍MUR2080CT二极管在电源、…

linux环境安装mysql数据库

一&#xff1a;查看是否自带mariadb数据库 命令&#xff1a;rpm -qa | grep mariadb 如果自带数据库则卸载掉重新安装 命令&#xff1a;yum remove mariadb-connector-c-3.1.11-2.el8_3.x86_64 二&#xff1a;将压缩文件上传到/user/local/mysql文件夹 或者直接下载 命令&a…