Git进阶命令-revert
有关Git,之前有写过两篇文章:
一、revert命令使用场景
有一天项目经理跟你说,你开发上线的代码有问题,需要马上撤回。
撤回?你第一反应那不就是 reset一下嘛。
正当你满心欢喜,想找到需要reset 的commitId时,你惊喜的发现,master分支上已经有其他同同事提交的代码了。
怎么办?用reset的话 会把同事这部分代码也撤回了。
但此时情况又十分紧急,你绞尽脑汁也没有想到好的办法。只能任性的使用 reset。
然后低头哈腰的让同事把他们代码重新合一遍,从此你在你同事眼里就打上了菜鸡的标签。
二、reset 和 revert 区别
reset命令是重置到一个记录:git reset是将之前的提交记录全部抹去,将 HEAD 指向自己重置的提交记录;
revert命令是撤回一个记录;git revert 操作是撤回某一次提交记录,若之后又有提交,提交记录还存在。
三、示例演示
我们通过示例来更好的理解 revert 命令

上面是最近的5次提交记录,这时第3提交有错误,需要撤回这次提交。
执行命令
git revert 6274264
因为 revert 会生成一条新的提交记录,这时会让你编辑提交信息,编辑完后 :wq 保存退出就好了。

保存之后,我们再来看当前提交的记录

通过提交历史日志我们可以发现 虽然是撤回提交3,但之前4和5的提交记录都还在,这点和reset 不一样。
说明 git revert 可以保留完整的 git 历史,对多人合作的分支来说比较友好。
同时我们也看下 1ccafe6 这次到底提交了什么内容
查看命令
git show 1ccafe6

我们可以看出,这次revert 仅仅撤回 第 3 次提交的内容。它采用逆向操作。如果之前有创建文件->删除文件,新增代码->删除代码,删除代码->新增代码等。
通过这样一种方式,来撤回具体某一次的操作。
git revert 是反做撤销其中的commit-id,然后重新生成一个commit-id。本身不会对其他任何的提交commit-id产生影响
四、revert 合并提交有坑
在 git 的 commit 记录里,还有一种类型是合并提交,想要 revert 合并提交,使用上会有些不一样。

现在 发现 3b5ad0c 合并分支提交有误,需要撤回。
1、坑一
我们用上面同样的命令
$ git revert 3b5ad0c
error: commit 3b5ad0cfcad49f7d2caa65449a8adf713da0accd is a merge but no -m option was given.
fatal: revert failed
使用刚刚同样的 revert 命令,会发现命令行报错了。
为什么会这样?
因为merge操作有2个分支,而revert不知道要还原哪个分支的提交。需要使用-m 1参数来告诉revert命令哪个是主线。
选择主线就还原非主线,选择非主线就还原主线。
修改命令
git revert -m 1 3b5ad0c

可以发现revert撤销成功了。
2、坑二
在上面的场景中,虽然撤销了master合并到feature这一次提交。
但如果你在切到master,再将修改后的代码提交。再次合并到feature分支时,会发现之前被 revert 的修改内容没有重新合并进来。
那是因为你在feature 虽然使用了 revert 命令。但当前分支还是会保留之前合并的记录,git 判断有相同的 commitHash,就忽略了相关 commit 修改的内容。
这时就需要 revert 掉之前 revert 的合并提交。
具体命令
- 83c20e0是之前撤销合并请求的commitId
git revert 83c20e0
这样之后,之前 通过revert 撤回的代码才不会丢失。
对于 revert 撤回 Merge 提交,你必须重新把Revert的再Revert回去,不然Git会认为你不需要这些内容。也就是说,下一次Merge的时候,会丢失代码!
五、git revert 选项
git revert -e / --edit commit-id
这是默认的选项,你不需要单独配置它,有了这个配置,在执行 git revert 后,会弹出默认编辑器来让你对该次变更的信息进行修改。
git revert --no-edit commit-id
与 -e / --edit 相反,传入这个选项那么就不会弹出默认编辑器来让你修改变更信息。
git revert -n / --no-commit commit-id
传入这个选项意味着 git revert 执行后并不会自动产生commit,而是把改动的代码加到工作区和暂存区,用户可以自行修改并提交commit。
总的来讲 git revert其实算是一个进度往前走的逆向提交,也就是说HEAD版本及提交记录将会继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
**声明**: 公众号如需转载该篇文章,发表文章的头部一定要 告知是转至公众号: 后端元宇宙。同时也可以问本人要markdown原稿和原图片。其它情况一律禁止转载!
Git进阶命令-revert的更多相关文章
- git进阶命令
首先, clone 一个远端仓库,到其目录下: $ Git clone git://example.com/myproject $ cd myproject 然后,看看你本地有什么分支: $ git ...
- git revert 后悔了 还原修改前的版本 + git 常用命令
昨天手残 然后在GitHub for windows 上点了revert 然后就给重置了 更手残的是又给同步了 . 但是 GitHub 会保留之前的版本 . 只要删掉本次修改就可. 解决方案: g ...
- git命令——revert、reset
参考:如何在 Git 中重置.恢复,返回到以前的状态 使用git时,如果对刚刚提交的后悔了怎么办,如何撤销? 方法一:手动修改 你把新增的文件删了 或者 更改过的文件再改回来,然后再commit一次. ...
- git 常用命令 mv rm checkout revert reset
关于上节讲的git add 时需要添加注释信息,也可以在git commit时再添加 laoni@DESKTOP-TPPLHIB MINGW64 /c/laoni/PycharmProjects/gi ...
- Git进阶:常用命令和问题案例整理
一.前言 整理常用git命令和以及在实际使用的过程中碰到的问题案例,旨在git进阶,提升工作开发效率,有需要补充的小伙伴欢迎下方留言,本篇持续更新中... 二.命令 配置用户名和邮箱 git conf ...
- Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )
在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题.以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分: 如何修改 ori ...
- Git 常用命令
一.初始環境配置 git config --global user.name "John Doe"git config --global user.email johndoe@ex ...
- Git 常用命令详解
Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) Git 的更多介绍 ...
- Git 进阶指南
转自: https://github.com/kaiye/kaiye.github.com/issues/7 在掌握了基础的 Git 使用 之后,可能会遇到一些问题.以下是猫哥筛选总结的部分常见问题, ...
- Git常用命令总结
Git常用命令总结 git init 在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹. git clone ...
随机推荐
- java将集合里面的元素拼接为一条String字符串
java将集合里面的元素拼接为一条String字符串 1️⃣ 随便创建一个list集合,往里面塞入元素 2️⃣ 第一种方式:通过foreach循环实现 但是通过这种方式只能将list集合里面的元素取出 ...
- Python中os.walk函数说明
这个函数对于文件方面的遍历等其他方面的操作来说功能很强大,比如批量修改文件名.批量移动文件.将所有不在一个文件夹下的文件移动到同一个文件夹下等等. 这个其实很简单的,用一个示例就能明白这个函数的具体用 ...
- Java 中,byte 数据类型的取值范围为什么是 -128 - 127 ?其它数值类型 都雷同
byte 的取值范围:-128 - 127 基本的数学计算方法,一个byte占8位,第一位为符号位,还有7位,7位能表示最大为:2^7 - 1 怎么来的呢:看如下数学计算 1111 111 = 2^0 ...
- .NET Core开发实战(第16课:选项数据热更新:让服务感知配置的变化)--学习笔记
16 | 选项数据热更新:让服务感知配置的变化 选项框架还有两个关键类型: 1.IOptionsMonitor 2.IOptionsSnapshot 场景: 1.范围作用域类型使用 IOptinsSn ...
- JS 判断两个数组是否相等,元素以及顺序相等,顺序不同但元素相等
壹 ❀ 引 在日常开发中,判断两个数组是否相等应该是较为常见的场景,因为常用,所以想着简单记录下.关于判断数组相等,这里我分为两种场景,第一种是数组完全相等,即数组元素相同且元素顺序一致:第二则为元素 ...
- Linux Vim操作看这篇文章就够了
一.什么是Vim Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.代码补全.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和Emac ...
- 【framework】应用进程启动流程
1 前言 Activity启动流程 中介绍了从点击桌面上应用快捷方式到 Activity 的 onCreate() 方法调用流程,本将介绍应用进程的启动流程.由于应用进程启动流程复杂,本文按进程将其拆 ...
- HTML前置知识
1.概念 HTML:超文本标记语言 (英语:Hypertext Markup Language,简称:HTML ) 创建网页的标准标记语言 后缀:html,htm(两者没有区别) html语法对大小写 ...
- Qt+MySql开发笔记:Qt5.9.3的mingw32版本编译MySql8版本驱动并Demo连接数据库测试
前言 之前特定的mysql版本msvc版本已经调通了,但是为了更好的跨平台,所以选择用mingw32版本,于是需要编译mysql驱动的mingw32版本的驱动库,以便提供给qt连接mysql使用. ...
- 3dMax建模笔记(一):介绍3dMax和创建第一个模型Hello world
前言 三维模型,虽然淘宝上一抓一大把,但是三维开发人员最好还是具备一定基础的建模能力.本文用hello world模型描述基本的3dMax建模流程. 3dMax 3D Studio Max ...