作为版本控制管理器,Git应当具备版本回退等一系列功能——它的应用场景也很常见,当你在工作区开发时,忽然发现:怎么我这版本写的代码还不如上一版本好?这时,版本回退功能就派上用场了。

一.版本回退

1.概览

首先我们先明确版本回退的指令

git reset [--soft]|--mixed|[--hard]  [HEAD]

我们来一一解释这几个选项对应的作用。

ReadMe工作区暂存区版本库选项
git worldgit worldgit worldgit--soft
git worldgitgit--mixed
gitgitgit--hard

1.--soft:仅回退版本库的内容

2.--mixed:回退暂存区和版本库内容,是默认选项

3.--hard:将所有区域内容全部回退,有可能会覆盖当前工作区的内容,建议谨慎使用。

2.回退工作流

1.git log——查看日志。若要执行回退,首先要明确回退到哪个版本。

wujiahao@VM-12-14-ubuntu:~/gitcode$ git log --pretty=oneline
18812885f304b7ba2baa67a109a2762ebb6f85c3 (HEAD -> master) add some files
f5aa7498c931ae9bc6cf0edfa400f7ceb28816a9 add first word

2.git reset ——执行回退,选项后面跟上commitID即可。例如这里回退到 add some files。

wujiahao@VM-12-14-ubuntu:~/gitcode$ git reset --hard 18812885f304b7ba2baa67a109a2762ebb6f85c3
HEAD is now at 1881288 add some files#现在的效果
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

3.git reflog——如果后悔回退怎么办?可以查找本地所有reset操作的日志,回退到其他想要的版本(继续执行git reset即可)

wujiahao@VM-12-14-ubuntu:~/gitcode$ git reflog
1881288 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
d6a7559 HEAD@{1}: commit: Modify ReadMe Third
1881288 (HEAD -> master) HEAD@{2}: reset: moving to 18812885f304b7ba2baa67a109a2762ebb6f85c3
1881288 (HEAD -> master) HEAD@{3}: commit: add some files
f5aa749 HEAD@{4}: commit (initial): add first word

3.回退的原理

我们在执行版本回退时,会发现其执行速度非常快。那么它的原理是什么呢?

根据commitID直接修改HEAD指针指向的git对象

二.撤销修改

1.概览

撤销修改的情况可以大概分为以下几类:

情况执行操作
仅修改工作区git checkout -- filename
执行了add,但没有commit到版本库

1.git reset --hard filename

2.git reset --mixed filename

git checkout -- filename

已经commit到版本库,但没有执行push到远程仓库git reset --hard

接下来一一进行详解。

2.详解

1.仅修改工作区

例如这里我们对ReadMe写入xxx code

wujiahao@VM-12-14-ubuntu:~/gitcode$ vim ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
xxx code

怎样回退到之前的版本?我们当然可以选择用vim编辑器等修改,但是修改的部分越多越复杂,这种方法越不实用。因此我们使用以下方法:

git checkout -- filename

wujiahao@VM-12-14-ubuntu:~/gitcode$ git checkout -- ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

2.执行了add,但没有commit到版本库

我们写入this is the second change并执行add

wujiahao@VM-12-14-ubuntu:~/gitcode$ vim ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
this is the second change
wujiahao@VM-12-14-ubuntu:~/gitcode$ git add ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)modified:   ReadMeUntracked files:(use "git add <file>..." to include in what will be committed)file5

git status

查看当前git状态,发现暂存区有文件被修改(ReadMe)

首先这里有两种解决办法,一种直接reset –hard,另一种是reset –mixed(默认选项),默认回退版本库和暂存区,相当于回到了第一种情况。在这里介绍第二种用法

wujiahao@VM-12-14-ubuntu:~/gitcode$ git reset HEAD ReadMe
Unstaged changes after reset:
M	ReadMe
wujiahao@VM-12-14-ubuntu:~/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:   ReadMeUntracked files:(use "git add <file>..." to include in what will be committed)file5no changes added to commit (use "git add" and/or "git commit -a")

然后再使用和情况1的指令即可

wujiahao@VM-12-14-ubuntu:~/gitcode$ git checkout -- ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)file5nothing added to commit but untracked files present (use "git add" to track)
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

3.已经commit到版本库,但没有执行push到远程仓库

我们加入 this is the third change,并且add和commit

wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
wujiahao@VM-12-14-ubuntu:~/gitcode$ vim ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git
this is the third change
wujiahao@VM-12-14-ubuntu:~/gitcode$ git add ReadMe
wujiahao@VM-12-14-ubuntu:~/gitcode$ git commit -m "Modify ReadMe Third "
[master d6a7559] Modify ReadMe Third1 file changed, 1 insertion(+)

只需要用reset的hard选项即可,HEAD表示当前版本,那么上个版本就是HEAD^

wujiahao@VM-12-14-ubuntu:~/gitcode$ git reset --hard HEAD^
HEAD is now at 1881288 add some files
wujiahao@VM-12-14-ubuntu:~/gitcode$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)file5nothing added to commit but untracked files present (use "git add" to track)
wujiahao@VM-12-14-ubuntu:~/gitcode$ cat ReadMe
hello Linux
hello git

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习日记-JS+DOM-day54-9.12

1.javascript基本说明知识点核心内容重点JavaScript基础控制HTML内容与属性&#xff0c;实现动态行为&#xff08;如开灯/关灯效果&#xff09;src属性路径修正&#xff08;./与../的区别&#xff09;前端三要素HTML&#xff08;内容&#xff09;、CSS&#xff08;样式&#xf…

使用tree命令导出文件夹/文件的目录树( Windows 和 macOS)

你可以在终端&#xff08;命令提示符&#xff09;中使用 tree 命令来清晰直观地查看和导出文件夹的目录结构。下面我会详细告诉你如何在 Windows 和 macOS 上使用它。 &#x1f5a5;️ tree 命令基本用法 tree 命令的核心作用是以树状图的形式展示指定路径下的目录和文件结构。…

GrapeCity Documents V8.0 Update2 重磅发布:性能飞跃、AI 赋能与文档处理全流程升级

作为葡萄城旗下服务端文档组件库&#xff0c;GrapeCity Documents&#xff08;简称"GcDocs"&#xff09;凭借跨平台、高兼容的优势&#xff0c;已成为 众多开发者构建文档生成、编辑、转换与管理系统的首选。 近日&#xff0c;GcDocs 迎来 V8.0 Update2 版本更新&am…

水质在线监测系统御控物联网解决方案

一、行业背景与需求痛点水质安全是饮用水供应、工业生产、生态保护的核心要素。随着《水污染防治行动计划》的深入实施&#xff0c;传统水质监测方式面临三大挑战&#xff1a;时效性不足&#xff1a;人工采样-实验室分析周期长达24-72小时&#xff0c;难以实时捕捉污染事件&…

【完整源码+数据集+部署教程】仓库物品分类检测图像分割系统源码和数据集:改进yolo11-convnextv2

背景意义 研究背景与意义 随着现代物流和仓储管理的快速发展&#xff0c;物品分类与检测技术在提高仓库运营效率、降低人工成本方面发挥着越来越重要的作用。传统的物品管理方式往往依赖人工识别和分类&#xff0c;效率低下且容易出错。为了解决这一问题&#xff0c;基于计算机…

浏览器稳定性提升之路:线上崩溃率优化中的 Return 与 CHECK 之争

一、前言在大型 C 工程&#xff08;例如 Chrome 浏览器内核&#xff09;中&#xff0c;开发者经常会遇到这样的选择&#xff1a; 到底应该在关键点使用 CHECK 直接崩溃&#xff0c;还是使用 return、LOG 记录错误然后继续执行&#xff1f;这看似只是一个代码风格问题&#xff0…

【数据结构与算法Trip第3站】双指针

我们来详细讲解一下算法中非常常用且重要的技巧——双指针法。 这是一个概念清晰但应用极其广泛的技术&#xff0c;掌握它能帮助你高效解决许多问题。 一、什么是双指针法&#xff1f; 核心思想&#xff1a;顾名思义&#xff0c;就是在遍历对象&#xff08;通常是数组或链表&am…

时序数据库选型指南:基于大数据视角的IoTDB应用优势分析详解!

目录 一、时序数据库选型的基本原则 1.1 数据特征与需求分析 1.1.1 数据规模与写入负载 1.1.2 查询需求 1.1.3 数据保留与归档策略 1.1.4 系统扩展性与高可用性 1.2 技术架构与系统性能评估 1.2.1 写入性能 1.2.2 查询性能 1.2.3 数据压缩能力 1.2.4 高可用性与灾备…

缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(三)

第三部分&#xff1a;缓存雪崩——大量key失效引发的“系统性崩溃” 缓存雪崩的本质是“大量缓存key在同一时间失效&#xff0c;或缓存集群整体故障”&#xff0c;导致请求全量穿透至DB&#xff0c;引发“系统性崩溃”。 案例4&#xff1a;电商首页的“批量过期”灾难 故障现场…

解决docker配置了镜像源但还会拉取官方镜像源的问题

&#x1f3d3;我们有时候虽然配置了Docker国内镜像源&#xff0c;但是还是会绕过去请求官方镜像源&#xff08;docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": context deadline exceeded&#xff09;&#xff0c;现在我们就来解决一…

R语言水文、水环境模型优化:从最速上升法、岭分析到贝叶斯优化与异方差处理,涵盖采样设计、代理模型与快速率定等

在水利工程、环境治理、生态保护、机械设计与航天航空等现代工业与科学领域&#xff0c;数学模型已成为不可或缺的核心分析、预测与决策工具。然而&#xff0c;随着系统复杂性的日益增长&#xff0c;模型构建的精确性、参数率定的效率以及不确定性量化的重要性被提到了前所未有…

关于数据采集与处理心得(一)

目前所实践的经验告知我&#xff01;1. 别企图妄想一个脚本解决所有问题要学会对问题分解&#xff0c;编写多个脚本一步步将问题解决&#xff0c;如果每一个步骤都为了下一个阶段的成果打地基&#xff0c;也是非常OK的。同时要尽可能将每一个编写的脚本都尽到最大的利用率2. 编…

IvorySQL 适配 LoongArch® 龙架构

IvorySQL 社区很高兴向您宣布&#xff0c;IvorySQL 已成功适配LoongArch 龙架构&#xff0c;为国产数据库与国产芯片的深度融合迈出了坚实一步。这一里程碑标志着 IvorySQL 在推动国产化生态建设、赋能信创产业方面取得了重大突破&#xff0c;为用户提供更高效、稳定、安全的数…

数据库分库分表是考虑ShardingSphere 还是Mycat?

http://www.mycat.org.cn/ https://shardingsphere.apache.org/ 这是一个非常核心且优秀的问题。在选择 ShardingSphere 和 Mycat 之间&#xff0c;对于游戏这种高性能、高复杂度的场景&#xff0c;目前行业内的主流选择和发展趋势毫无疑问是 ShardingSphere。 我会为你详细对…

mysql分库分表数据量核查问题

场景&#xff1a; 使用分库分表的业务有时分库数量几百甚至上千&#xff0c;当主管需要查询每个库中的数据&#xff0c;掌握数据分布情况。要你查看哪些库中的表数量大于某个量级的给找出来 &#xff0c;你会怎么做。 例子 &#xff1a; mysql库数量&#xff1a;db_xx_devicein…

python之socket网络编程

引言 在互联网时代&#xff0c;网络编程已经成为开发人员必备的技能之一。无论是Web开发、实时通信还是分布式计算&#xff0c;都离不开网络编程的支持。Python提供的socket模块为我们提供了简洁而强大的接口&#xff0c;可以轻松实现客户端和服务器之间的通信。 Socket编程是网…

WPF Telerik.Windows.Controls.Data.PropertyGrid 自定义属性编辑器

1.AI帮忙定义新用户控件 2.在属性上添加TelerikEditorAttribute特性 private ObservableCollection<string> _axisOrder;[Display(Description "点位", GroupName "通用", Name "轴&顺序", Order 1)][DataMember][TelerikEditorAt…

【超详细】别再看零散的教程了!一篇搞定Gitee从注册、配置到代码上传与管理(内含避坑指南最佳实践)

&#x1f525;个人主页&#xff1a;艾莉丝努力练剑 ❄专栏传送门&#xff1a;《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题、洛谷刷题、C/C基础知识知识强化补充、C/C干货分享&学习过程记录 &#x1f349;学习方向&#xff1a;C/C方向学习者…

43.shell脚本循环与函数

shell脚本循环与函数 for 循环 for 循环用于一次性读取多个信息&#xff0c;逐一对信息进行操作处理&#xff0c;特别适合处理有范围的数据 语法 for 变量名 in 取值列表 do命令序列 done批量创建用户 #!/bin/bashtouch /root/users.txt echo aka blues cloe dio foks > /ro…

模型部署:(四)安卓端部署Yolov8-v8.2.99实例分割项目全流程记录

模型部署&#xff1a;&#xff08;四&#xff09;安卓端部署Yolov8-v8.2.99实例分割项目全流程记录1、下载ncnn2、下载opencv-mobile3、文件拷贝4、andorid_studio相关配置5、文件内参数设置5、重构项目&#xff1a;6、打包apk7、部署自己训练的实例分割模型1、下载ncnn 地址&…