Git | git revert命令详解
关注:CodingTechWork
引言
Git 是一个强大的版本控制工具,广泛应用于现代软件开发中。它为开发人员提供了多种功能来管理代码、协作开发和版本控制。在 Git 中,有时我们需要撤销或回退某些提交,而git revert
是一个非常有用的命令。与git reset
等命令不同,git revert
能够通过创建新的提交来撤销历史提交,保证项目历史的完整性。
在本篇文章中,我们将详细介绍 Git 中 git revert
的使用方式、工作原理、实战示例以及一些注意事项。
git revert介绍
git revert
用于撤销一个已经提交到 Git 仓库的更改。不同于git reset
,git revert
会通过创建一个新的提交
来“反转”
指定提交的内容,而不会改变历史提交的记录
。因此,git revert
是一种更安全的回退操作,适用于团队合作中,因为它不会影响历史提交的结构。
git revert 的工作原理
git revert
原理:
- 生成新的提交:
git revert
会创建一个新的提交,内容是要撤销的提交的“反操作”。也就是说,git revert
会通过相反的改动来撤销指定提交的更改。例如,如果原来提交中增加了某些代码行,git revert
会通过删除这些行来撤销该提交。 - 保持项目历史的完整性:与
git reset
可能修改项目历史不同,git revert
不会删除任何提交,而是通过新的提交来记录撤销操作
,从而保证了版本历史的完整性。这使得它特别适用于公共分支(如master
或main
分支)。
执行步骤:
- Git 会根据指定的提交,计算出需要反向操作的更改。
- 创建一个新的提交,将这些反向更改应用到当前工作区。
- 你可以选择是否修改提交信息(默认信息为“Revert ”)。
- 提交反向更改,新的提交将插入到当前分支历史中。
git revert 的常见用法
撤销单个提交
假设我们在分支上做了多次提交,其中有一个提交包含了不需要的更改。使用 git log
查看提交历史:
git log --oneline
输出结果可能是这样的:
a1b2c3d (HEAD -> master) Added new feature
a1342cf Fixed bug in feature X
d4e5f6g Added README file
如果你想撤销某个特定提交,可以直接指定该提交的哈希值(commit hash)来执行git revert
。
git revert <commit-hash>
例如,如果你想撤销提交 a1b2c3d,可以运行以下命令:
git revert a1b2c3d
Git 会自动生成一个新的提交,反向应用 a1b2c3d 提交中的修改,并提示你输入提交消息。
撤销多个提交
如果你需要撤销一系列提交,可以使用 git revert
的-n
或--no-commit
选项,它会将所有反向更改暂时保存在暂存区中,但不会立即提交。你可以手动编辑这些更改,并最终一起提交。
git revert -n <commit-hash1>^..<commit-hash2>
<commit-hash1>^..<commit-hash2>
表示从<commit-hash1>
到<commit-hash2>
的提交范围。^
表示选择<commit-hash1>
的父提交,因此是一个范围。
举个例子,撤销从提交 a1b2c3d 到提交 d4e5f6g 的所有修改:
git revert -n a1b2c3d^..d4e5f6g
执行后,所有变更会暂时存放在暂存区,等待提交。
举个例子:
假设你有以下的提交历史:
* abc1234 (HEAD -> master) Merge feature-branch into master
* d7e6b2d (feature-branch) Add new feature
* 3a6c0f2 (master) Initial commit
其中,abc1234 是一个合并提交,feature-branch 被合并进了 master。现在,你想撤销这个合并提交,并希望保留 master 分支的变更,因此使用命令:
git revert -m 1 abc1234
这个命令会创建一个新的提交,撤销合并操作中的更改,实际上它将会 恢复到 abc1234 合并之前的状态,但历史记录仍会保留合并提交。新的提交将会与 abc1234 之后的提交一起继续保留在历史中。
为什么需要 -m 参数?
合并提交有多个父提交,Git 需要知道你希望保留哪个父提交的内容。-m 1
表示选择第一个父提交作为保留的版本,通常是主分支的版本。如果你使用 -m
,那么 Git 将选择第二个父提交,通常是被合并进来的分支的版本。
使用交互式 git revert
当你想撤销多个提交时,有时会遇到冲突,Git 会提示你进行冲突解决。git revert
会一个一个地撤销指定的提交,并且如果有冲突,Git 会停止并让你解决冲突。解决冲突后,你可以继续操作。
解决冲突后运行:
git revert --continue
如果你决定取消当前的撤销操作,可以使用:
git revert --abort
撤销合并提交
有时,你可能会遇到需要撤销合并提交的场景。合并提交具有特殊的结构,因此在执行 git revert 时需要额外小心。假设你有一个合并提交 abc1234,可以使用以下命令来撤销它:
git revert -m 1 abc1234
-m 1
: 指定了合并提交的“主父提交”(通常是主分支)。-m
后面的数字表示选择哪个父提交作为保留版本。
通过 git revert -m
,Git 会根据指定的父提交创建一个新的提交来撤销合并操作。
强制跳过某次提交的提交信息编辑
在某些场景下,你可能希望跳过git revert
操作中的提交信息编辑过程。可以通过--no-edit
选项来跳过:
git revert --no-edit f7e8b2c
这个命令会直接执行`git revert操作,但不会弹出编辑器让你修改提交信息,而是使用默认的信息。
实战示例:撤销错误提交
假设你正在一个开发分支feature/login
上工作,发现最近的一个提交引入了一个错误。你需要撤销该错误提交,但又不想修改历史提交(即不使用 git rese
t)。这时,git revert
就非常适合。
查看提交历史
首先,我们查看最近的提交历史,找到要撤销的提交。
git log --oneline
输出可能是这样的:
a1b2c3d Add login feature
d4e5f6g Fix UI bug
h7i8j9k Update documentation
假设提交 a1b2c3d 引入了一个错误,我们需要撤销它。
执行 git revert
接下来,使用 git revert 撤销该提交:
git revert a1b2c3d
Git 会自动生成一个新的提交,撤销 a1b2c3d 中的所有更改。
解决冲突
如果 Git 在应用反向更改时发生了冲突,Git 会提示你进行冲突解决。你需要打开冲突文件,手动解决冲突,然后执行:
git add <conflicted-file>
git revert --continue
完成提交
最终,提交就会成功创建,撤销操作也完成了。可以通过 git log 查看新的提交记录,确认撤销操作已经生效。
git log --oneline
输出可能是:
f7g8h9i Revert "Add login feature"
a1b2c3d Add login feature
d4e5f6g Fix UI bug
h7i8j9k Update documentation
着重讲一下git revert -m
git提交历史模拟
假设我们有以下的 Git 历史:
* abc1234 (HEAD -> master) Merge feat02-branch into master
* def5678 (feat02-branch) Add feature 2
* ghi2345 (feat01-branch) Add feature 1
* jkl3456 (master) Initial commit
在这个例子中:
- abc1234 是合并提交,它将 feat02-branch 合并到 master。
- def5678 是 feat02-branch 上的提交,它增加了 feat02-branch 的功能。
- ghi2345 是 feat01-branch 上的提交,它增加了 feat01-branch 的功能。
- jkl3456 是 master 上的初始提交。
合并提交 abc1234 是一个合并提交,它有两个父提交:
- jkl3456(master 分支的提交)
- def5678(feat02-branch 分支的提交)
git revert -m 1 abc1234
git revert -m 1 abc1234
表示撤销合并提交 abc1234,并保留第一个父提交(master 分支的提交)。即,撤销 feat02-branch 的更改并保留 master 分支的更改。
执行这个命令后,Git 会生成一个新的提交,撤销合并 feat02-branch 到 master
的操作,而不影响 feat01-branch 和 master 之间的关系。
命令:
git revert -m 1 abc1234
git revert -m 2 abc1234
git revert -m 2 abc1234
表示撤销合并提交 abc1234,并保留第二个父提交(feat02-branch 分支的提交)。即,撤销 master 上的更改并保留 feat02-branch 的更改。
执行这个命令后,Git 会生成一个新的提交,撤销 master
分支的更改,同时保留 feat02-branch
的更改。
命令:
git revert -m 2 abc1234
git revert -m 3 abc1234
git revert -m 3
是一个特殊情况,适用于三方合并,通常会有多个父提交。例如,如果合并提交涉及 feat01-branch、feat02-branch 和 master 三个分支,那么可以使用 -m 3 来指定第三个父提交。然而,在我们这个例子中,由于合并提交 abc1234 只涉及 master 和 feat02-branch 两个父提交,因此 -m 3 不适用。假设有三方合并的历史如下:
* abcd1234 (HEAD -> master) Merge branch 'feat01-branch' and 'feat02-branch'
|\
| * 12345678 (feat01-branch) Commit in feat01-branch
* | 87654321 (feat02-branch) Commit in feat02-branch
|/
* 11223344 Initial commit in master
在这个示例中:
- abcd1234 是合并提交,具有 3 个父提交:
-
- 父提交 1:master(在 abcd1234 之前的提交)。
-
- 父提交 2:feat01-branch(合并进来的一个分支)。
-
- 父提交 3:feat02-branch(合并进来的另一个分支)。
git revert -m 3 abcd1234
使用-m 3
时,Git 会选择第三个父提交作为基准(在这个例子中是 feat02-branch),并撤销合并提交中的更改。也就是说,撤销的合并提交会回滚 master 和 feat01-branch 的更改,但保留 feat02-branch 上的内容。
git revert -m 3 abcd1234
效果:Git 会撤销 abcd1234 的合并,回滚 master 和 feat01-branch 上的修改。结果是保留了 feat02-branch 上的修改,并回滚了 master 和 feat01-branch 的修改。
-m 总结
git revert -m 1 <commit>
:撤销合并提交,保留第一个父提交的变更。git revert -m 2 <commit>
:撤销合并提交,保留第二个父提交的变更。git revert -m 3 <commit>
:撤销合并提交,保留第三个父提交的变更(适用于三方合并)。
git revert 与 git reset 的比较
git revert vs git reset
git revert
:
- 用于撤销已经提交的内容。
- 保持历史提交的完整性,不会改变提交记录。
- 适用于公共分支,避免影响其他开发人员的工作。
git reset
:
- 用于重置当前分支的指针,可以回退到某个历史提交。
- 会改变提交历史,可能导致丢失更改。
- 适用于个人分支或本地仓库的操作。
哪个更适合团队合作?
在团队协作中,通常建议使用git revert
,因为它不会重写历史,而是创建一个新的提交,撤销先前的更改。这样可以保证团队成员之间的协作历史不受干扰。
注意事项
- 小心使用
git revert
:git revert
会创建新的提交,因此如果你频繁地进行撤销操作,可能会导致提交历史变得冗长。在撤销多个提交时,可以考虑将多个撤销操作合并到一次提交中,以保持清晰的历史记录。 - 处理冲突:当你撤销提交时,可能会遇到文件冲突。务必认真解决冲突,以确保撤销操作正确执行。
- 避免在已经发布的分支中使用 git reset:
git reset
会重写历史,这会给协作带来麻烦,而git revert
保持了历史的连贯性,因此在公共分支中,推荐使用git revert
。
总结
git revert
是 Git 中撤销历史提交的强大工具,能够通过创建新的提交来撤销指定的更改,保持项目历史的完整性,避免重写历史,适用于团队合作中的常见场景。通过理解和掌握git revert
,开发人员可以更加灵活和安全地管理代码历史,并在出现错误时轻松回退。
相关文章:
Git | git revert命令详解
关注:CodingTechWork 引言 Git 是一个强大的版本控制工具,广泛应用于现代软件开发中。它为开发人员提供了多种功能来管理代码、协作开发和版本控制。在 Git 中,有时我们需要撤销或回退某些提交,而git revert 是一个非常有用的命令…...
ASP.NET Core 中,Cookie 认证在集群环境下的应用
在 ASP.NET Core 中,Cookie 认证在集群环境下的应用通常会遇到一些挑战。主要的问题是 Cookie 存储在客户端的浏览器中,而认证信息(比如 Session 或身份令牌)通常是保存在 Cookie 中,多个应用实例需要共享这些 Cookie …...
Flyte工作流平台调研(五)——扩展集成
系列文章: Flyte工作流平台调研(一)——整体架构 Flyte工作流平台调研(二)——核心概念说明 Flyte工作流平台调研(三)——核心组件原理 Flyte工作流平台调研(四)——…...
【AUTOSAR 基础软件】软件组件的建立与使用(“代理”SWC)
基础软件往往需要建立一些“代理”SWC来完成一些驱动的抽象工作(Complex_Device_Driver_Sw或者Ecu_Abstraction_Sw等),或建立Application Sw Component来补齐基础软件需要提供的功能实现。当面对具体的项目时,基础软件开发人员还可…...
java通过ocr实现识别pdf中的文字
需求:识别pdf文件中的中文 根据github项目mymonstercat 改造,先将pdf文件转为png文件存于临时文件夹,然后通过RapidOcr转为文字,最后删除临时文件夹 1、引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId&g…...
Git 命令代码管理详解
一、Git 初相识:版本控制的神器 在当今的软件开发领域,版本控制如同基石般重要,而 Git 无疑是其中最耀眼的明珠。它由 Linus Torvalds 在 2005 年创造,最初是为了更好地管理 Linux 内核源代码。随着时间的推移,Git 凭借…...
Docker的安装和使用
容器技术 容器与虚拟机的区别 虚拟机 (VM) VM包含完整的操作系统,并在虚拟化层之上运行多个操作系统实例。 VM需要更多的系统资源(CPU、内存、存储)来管理这些操作系统实例。 容器 (Container) 容器共享主机操作系统的内核,具…...
Flink系统知识讲解之:Flink内存管理详解
Flink系统知识讲解之:Flink内存管理详解 在现阶段,大部分开源的大数据计算引擎都是用Java或者是基于JVM的编程语言实现的,如Apache Hadoop、Apache Spark、Apache Drill、Apache Flink等。Java语言的好处是不用考虑底层,降低了程…...
使用JMeter模拟多IP发送请求!
你是否曾遇到过这样的场景:使用 JMeter 进行压力测试时,单一 IP 被服务器限流或者屏蔽?这时,如何让 JMeter 模拟多个 IP 发送请求,成功突破测试限制,成为测试工程师必须攻克的难题。今天,我们就…...
【Ubuntu与Linux操作系统:六、软件包管理】
第6章 软件包管理 6.1 Linux软件安装基础 Linux的软件包是以二进制或源码形式发布的程序集合,包含程序文件和元数据。软件包管理器是Linux系统的重要工具,用于安装、更新和卸载软件。 1. 常见的软件包管理器: DEB 系统(如Ubunt…...
【数据结构-堆】力扣1834. 单线程 CPU
给你一个二维数组 tasks ,用于表示 n 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i 项任务将会于 enqueueTimei 时进入任务队列,需要 processingTimei 的时长完成执行。 现…...
【前端动效】原生js实现拖拽排课效果
目录 1. 效果展示 2. 效果分析 2.1 关键点 2.2 实现方法 3. 代码实现 3.1 html部分 3.2 css部分 3.3 js部分 3.4 完整代码 4. 总结 1. 效果展示 如图所示,页面左侧有一个包含不同课程(如语文、数学等)的列表,页面右侧…...
C#使用OpenTK绘制3D可拖动旋转图形三棱锥
接上篇,绘制着色矩形 C#使用OpenTK绘制一个着色矩形-CSDN博客 上一篇安装OpenTK.GLControl后,这里可以直接拖动控件GLControl 我们会发现GLControl继承于UserControl //// 摘要:// OpenGL-aware WinForms control. The WinForms designer will always call the default//…...
排序的本质、数据类型及算法选择
排序的本质、数据类型及算法选择 一、排序的本质二、排序的数据类型三、排序算法的选择依据 前两天老金写了篇 “十大排序简介”,有点意犹未尽,这一回老金想把排序连根拔起,从排序的本质说道说道。 一、排序的本质 从字面上理解,…...
Python的列表基础知识点(超详细流程)
目录 一、环境搭建 二、列表 2.1 详情 2.2 列表定义 2.3 列表长度 2.4 列表索引 2.5 切片索引 2.6 添加 2.7 插入 2.8 剔除 2.8.1 pop方法 2.8.2 del方法 2.9 任何数据类型 2.10 拼接 2.10.1 “” 2.10.2 “*” 2.11 逆序 编辑 2.12 计算出现次数 2.13 排序…...
HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现
HarmonyOS鸿蒙开发 弹窗及加载中指示器HUD功能实现 最近在学习鸿蒙开发过程中,阅读了官方文档,在之前做flutter时候,经常使用overlay,使用OverlayEntry加入到overlayState来做添加悬浮按钮、提示弹窗、加载中指示器、加载失败的t…...
【Ubuntu与Linux操作系统:一、Ubuntu安装与基本使用】
第1章 Ubuntu安装与基本使用 1.1 Linux与Ubuntu Linux是一种开源、类Unix操作系统内核,拥有高稳定性和强大的网络功能。由于其开源性和灵活性,Linux被广泛应用于服务器、嵌入式设备以及桌面环境中。 Ubuntu是基于Debian的一个流行Linux发行版…...
React 元素渲染
React 元素渲染 React 是一个用于构建用户界面的 JavaScript 库,它允许开发人员创建大型应用程序,这些应用程序可以随着时间的推移而高效地更新和渲染。React 的核心概念之一是元素渲染,它描述了如何将 JavaScript 对象转换为 DOM࿰…...
【2024年华为OD机试】 (C卷,100分)- 括号匹配(Java JS PythonC/C++)
一、问题描述 题目描述 给定一个字符串,里边可能包含“()”、“[]”、“{}”三种括号,请编写程序检查该字符串中的括号是否成对出现,且嵌套关系正确。 若括号成对出现且嵌套关系正确,或该字符串中无括号字符,输出&am…...
解锁企业数字化转型新力量:OpenCoze(开源扣子)
在当今数字化浪潮席卷之下,企业对于高效管理和协同运作的需求愈发迫切,而开源技术正逐渐成为众多企业破局的关键利器。今天,想给大家介绍一款极具潜力的开源项目 ——OpenCoze,中文名称 “开源扣子”。 一、OpenCoze 是什么&…...
【网络云SRE运维开发】2025第2周-每日【2025/01/12】小测-【第12章 rip路由协议】理论和实操考试题解析
文章目录 选择题答案及解析理论题答案及解析实操题答案及解析下一步进阶 选择题答案及解析 RIP路由协议是基于哪种算法的动态路由协议? 答案:B. 距离矢量算法解析:链路状态算法用于OSPF等协议;最小生成树算法主要用于生成树协议&…...
【微服务】8、分布式事务 ( XA 和 AT )
文章目录 利用Seata解决分布式事务问题(XA模式)AT模式1. AT模式原理引入2. AT模式执行流程与XA模式对比3. AT模式性能优势及潜在问题4. AT模式数据一致性解决方案5. AT模式一阶段操作总结6. AT模式二阶段操作分析7. AT模式整体特点8. AT模式与XA模式对比…...
CVE-2025-22777 (CVSS 9.8):WordPress | GiveWP 插件的严重漏洞
漏洞描述 GiveWP 插件中发现了一个严重漏洞,该插件是 WordPress 最广泛使用的在线捐赠和筹款工具之一。该漏洞的编号为 CVE-2025-22777,CVSS 评分为 9.8,表明其严重性。 GiveWP 插件拥有超过 100,000 个活跃安装,为全球无数捐赠平…...
TypeScript Jest 单元测试 搭建
NPM TypeScript 项目搭建 创建目录 mkdir mockprojectcd mockproject初始化NPM项目 npm init -y安装TypeScript npm i -D typescript使用VSCode 打开项目 创建TS配置文件tsconfig.json {"compilerOptions": {"target": "es5","module&…...
基于 SSH 的任务调度系统
文末附有完整项目代码 在当今科技飞速发展的时代,任务调度系统的重要性日益凸显。本文将详细介绍一个基于 SSH(SpringStruts2Hibernate)的任务调度系统的设计与实现。 一、系统概述 本系统旨在改变传统人工任务调度方式,通过计算…...
filestream安装使用全套+filebeat的模块用法
1 filestream介绍 官方宣布:输入类型为log在filebeat7.16版本已经弃用了 Filestream 是 Filebeat 中的一种 输入类型(Input),用于处理日志文件的读取。它是为了取代 Filebeat 中传统的 log 输入(Input)设…...
java项目之房屋租赁系统源码(springboot+mysql+vue)
项目简介 房屋租赁系统实现了以下功能: 房屋租赁系统的主要使用者分为: 系统管理:个人中心、房屋信息管理、预约看房管理、合同信息管理、房屋报修管理、维修处理管理、房屋评价管理等模块的查看及相应操作; 房屋信息管理&#…...
sap mm学习笔记
1. 业务流程 2. 组织架构 3. 物料主数据 4.采购主数据 5. 采购管理 6. 库存管理 7.物料主数据 8. 采购申请 ME51N...
代码随想录_链表
代码随想录02 链表 203.移除链表元素 力扣题目链接(opens new window) 题意:删除链表中等于给定值 val 的所有节点。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5] 示例 2: 输入:he…...
EF Code 并发控制
【悲观控制】 不推荐用,EF Core 没有封装悲观并发控制的使用,需要使用原生Sql来使用悲观并发控制 一般使用行锁、表锁等排他锁对资源进行锁定,同时只有一个使用者操作被锁定的资源 拿sql server举例,可以使用表所、或者行所解决…...
遇到灾难网站变灰怎么做/网站seo优化服务
说明:本文原创作者『strongerHuang』首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop标签:CAN、 CANOpen、 CanFestival一、写在前面教程前面文章讲述了《对象字典生成工具环境搭建》,因为对…...
政府网站建设工作经验交流/浏览器如何推广自己网站
当然我们也看家了这两位超人以及饰演者的帅气形象,而再细心看看下图我们会发现,除了手拿硕大的变身器另外一只手中还拿着一个圆形的东西,拾部君觉得是不是要把这个圆形的东西塞到变身器的孔里然后大叫“变身”才能变身?果然有点《…...
做自适应网站对设计稿的要求/推广普通话活动方案
一、有限状态机 有限状态机是一个特殊的有向图,包含节点和连接这些节点的弧。每个有限状态机都有开始、结束和若干个中间状态,每个弧上带有从一个状态进入下一个状态的条件。 以一个简化的购物流程为例,开始和结束之间有待下单、待支付、待发…...
如何给自己做网站/关键词排名优化如何
java里初始化一个类的对象,通过初始化快或者构造方法进行数据赋值。与其相关的执行代码有这么几种: 静态初始化块初始化块构造方法静态初始化块 静态初始化块只在类加载时执行一次,同时静态初始化块只能给静态变量赋值,不能初始化…...
一级做a视频在线观看网站/宁波网站seo公司
第一个QNX程序已经写完,测试了QNX应用的开发过程,开始写一些复杂一点点的程序。 最先想到的是获取键盘输入和通过控制台进行输出,这些都是当初学习C语言的时候必做的功课。 <wbr></wbr> 和标准的C语言一样,QNX C语…...
wordpress添加3d地图/网站排名seo
作为一名前端工程师,一个好的编辑器可以在编码期间,事半功倍。这里我分享一下vs code和atom这两种现今非常流行的编辑器,各有各的优缺点,看大家的喜好。我比较倾向于vs code,顺便也把插件整理了一下,给大家…...