【DevOps】Git 图文详解(八):后悔药 - 撤销变更

2023-11-22 23:44

本文主要是介绍【DevOps】Git 图文详解(八):后悔药 - 撤销变更,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Git 图文详解(八):后悔药 - 撤销变更

  • 1.后悔指令 🔥
  • 2.回退版本 reset
  • 3.撤销提交 revert
  • 4.checkout / reset / revert 总结

发现写错了要回退怎么办?看看下面几种后悔指令吧!

  • ❓ 还没提交的怎么撤销? —— checkoutreset
    • 还未提交的修改(工作区、暂存区)不想要了,用签出指令(checkout)进行撤销清除。
    • 或者用 checkout 的新版回滚指令 reset
  • ❓ 已提交但没有 push 的提交如何撤销?—— resetrevert
  • ❓ 已 push 的提交如何撤销?—— 同上,先本地撤销,然后强制推送 git push origin -f,⚠️注意慎用! 记得先 pull 获取更新。

在这里插入图片描述

1.后悔指令 🔥

指令
描述
git checkout .撤销工作区的(未暂存)修改,把暂存区恢复到工作区。不影响暂存区,如果没暂存,则撤销所有工作区修改
git checkout [file]同上,file 指定文件
git checkout HEAD .撤销工作区、暂存区的修改,用 HEAD 指向的当前分支最新版本替换工作区、暂存区
git checkout HEAD [file]同上,file 指定文件
git reset撤销暂存区状态,同 git reset HEAD,不影响工作区
git reset HEAD [file]同上,指定文件 fileHEAD 可省略
git reset [commit]回退到指定版本,清空暂存区,不影响工作区。工作区需要手动 git checkout 签出
git reset --soft [commit]移动分支 masterHEAD 到指定的版本,不影响暂存区、工作区,需手动 git checkout 签出更新
git reset --hard HEAD撤销工作区、暂存区的修改,用当前最新版
git reset --hard HEAD~回退到上一个版本,并重置工作区、暂存区内容
git reset --hard [commit]回退到指定版本,并重置工作区、暂存区内容
git revert [commit]撤销一个提交,会用一个新的提交(原提交的逆向操作)来完成撤销操作,如果已 push 则重新 push 即可
  • git checkout .git checkout [file] 会清除工作区中未添加到暂存区的修改,用暂存区内容替换工作区。
  • git checkout HEAD .git checkout HEAD [file] 会清除工作区、暂存区的修改,用 HEAD 指向的当前分支最新版本替换暂存区、工作区。
# 只撤销工作区的修改(未暂存)
$ git checkout .
Updated 1 path from the index# 撤销工作区、暂存区的修改
$ git checkout HEAD .
Updated 1 path from f951a96

2.回退版本 reset

reset 是专门用来撤销修改、回退版本的指令,支持的场景比较多,多种撤销姿势,所以参数组合也比较多。简单理解就是移动 master 分支、HEAD 的 “指针” 地址,理解这一点就基本掌握 reset 了。

如下图:

  • 回退版本 git reset --hard v4git reset --hard HEAD~2masterHEAD 会指向 v4 提交,v5v6 就被废弃了。
  • 也可以重新恢复到 v6 版本:git reset --hard v6,就是移动 masterHEAD 的 “指针” 地址。

在这里插入图片描述
reset 有三种模式,对应三种参数:mixed(默认模式)、softhard。三种参数的主要区别就是对工作区、暂存区的操作不同。

  • mixed 为默认模式,参数可以省略。
  • 只有 hard 模式会重置工作区、暂存区,一般用这个模式会多一点。

在这里插入图片描述
穿梭前,用 git log 可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用 git reflog 查看命令历史,以便确定要回到未来的哪个版本。

git reset [--soft | --mixed | --hard] [HEAD]# 撤销暂存区
$ git reset
Unstaged changes after reset:
M       R.md# 撤销工作区、暂存区修改
$ git reset --hard HEAD# 回退版本库到上一个版本,并重置工作区、暂存
$ git reset --hard HEAD~# 回到原来的版本(恢复上一步的撤销操作),并重置工作区、暂存
$ git reset --hard 5f8b961# 查看所有历史提交记录
$ git reflog
ccb9937 (HEAD -> main, origin/main, origin/HEAD) HEAD@{0}: commit: 报表新增导入功能
8f61a60 HEAD@{1}: commit: bug:修复报表导出bug
4869ff7 HEAD@{2}: commit: 用户报表模块开发
4b1028c HEAD@{3}: commit: 财务报表模块开发完成

3.撤销提交 revert

安全的撤销某一个提交记录,基本原理就是生产一个新的提交,用原提交的逆向操作来完成撤销操作。注意,这不同于 resetreset 是回退版本,revert 只是用于撤销某一次历史提交,操作是比较安全的。

在这里插入图片描述
如上图:

  • 想撤销 v4 的修改,执行 git revert v4,会产生一个新的提交 v-4,是 v4 的逆向操作。
  • 同时更新 maserHEAD “指针” 位置,以及工作区内容。
  • 如果已 push 则重新 push 即可。
# revert撤销指定的提交,“-m”附加说明
$ git revert 41ea42 -m '撤销对***的修改'
[main 967560f] Revert "123"1 file changed, 1 deletion(-)

4.checkout / reset / revert 总结

标题 / 指令
checkout
reset
revert
主要作用(撤销)撤销工作区、暂存区未提交修改回退版本,重置工作区、暂存区撤销某一次提交
撤销工作区git checkout [file]git reset HEAD [file]
撤销工作区、暂存区git checkout HEAD [file]git reset --hard HEAD [file]
回退版本git reset --hard [commit]
安全性只针对未提交修改,安全如回退了已 push 提交,不安全安全

这篇关于【DevOps】Git 图文详解(八):后悔药 - 撤销变更的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/413778

相关文章

基于Python编写一个git自动上传的脚本(打包成exe)

《基于Python编写一个git自动上传的脚本(打包成exe)》这篇文章主要为大家详细介绍了如何基于Python编写一个git自动上传的脚本并打包成exe,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录前言效果如下源码实现利用pyinstaller打包成exe利用ResourceHacker修改e

基于C++的UDP网络通信系统设计与实现详解

《基于C++的UDP网络通信系统设计与实现详解》在网络编程领域,UDP作为一种无连接的传输层协议,以其高效、低延迟的特性在实时性要求高的应用场景中占据重要地位,下面我们就来看看如何从零开始构建一个完整... 目录前言一、UDP服务器UdpServer.hpp1.1 基本框架设计1.2 初始化函数Init详解

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

自定义注解SpringBoot防重复提交AOP方法详解

《自定义注解SpringBoot防重复提交AOP方法详解》该文章描述了一个防止重复提交的流程,通过HttpServletRequest对象获取请求信息,生成唯一标识,使用Redis分布式锁判断请求是否... 目录防重复提交流程引入依赖properties配置自定义注解切面Redis工具类controller

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示

HTML5的input标签的`type`属性值详解和代码示例

《HTML5的input标签的`type`属性值详解和代码示例》HTML5的`input`标签提供了多种`type`属性值,用于创建不同类型的输入控件,满足用户输入的多样化需求,从文本输入、密码输入、... 目录一、引言二、文本类输入类型2.1 text2.2 password2.3 textarea(严格

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be