『现学现忘』Git后悔药 — 33、revert撤销(二)
提示:接上一篇文章。
4、一次移除某几次提交
上一篇文章的演示中,只有两个提交需要 revert
,我们可以一个个回退。但如果有几十个呢?一个个回退肯定效率太低而且容易出错。
(接上面示例)
我们可以使用以下方法进行批量回退:
(1)git revert
移除某几次提交的修改
命令:git revert <commit6> <commit5> <commit4> …
注意:提交的顺序是从最近的提交开始往前写。
示例:
# 1.查看版本库历史提交记录
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git log --oneline
30f7626 (HEAD -> master) Revert "第6次提交,revert 撤销第3次提交"
d0c8e48 Revert "第5次提交,revert 撤销第4次提交"
c04b29c 第4次提交,新增内容:revert test v4
fd819dc 第3次提交,新增内容:revert test v3
c71ae3c 第2次提交,新增内容:revert test v2
557f7c3 第1次提交,新增readme.txt文件
# 2.把第5、6次提交移除
# 先写提交5ID,在写提交6ID
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git revert d0c8e48 30f7626
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
error: could not revert d0c8e48... Revert "第5次提交,revert 撤销第4次提交"
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
说明:
Auto-merging readme.txt
:自动合并readme.txt
文件出现问题。CONFLICT (content): Merge conflict in readme.txt
:冲突(内容):在readme.txt中合并冲突。error: could not revert d0c8e48... Revert "第5次提交,revert 撤销第4次提交"
:无法还原d0c8e48提交。hint: after resolving the conflicts, mark the corrected paths
:解决冲突后,把冲突文件提交到暂存区。hint: with 'git add <paths>' or 'git rm <paths>'
:可使用“ git add <路径>”或“ git rm <路径>”方法,添加冲突文件到暂存区,或者删除文件。hint: and commit the result with 'git commit'
:提示:并使用'git commit'提交结果。
我们应该先写commit-6
,在写commit-5
。
# 1.撤销第5、6次提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git revert 30f7626 d0c8e48
[master 31341a4] Revert "Revert "第7次提交,revert 撤销第5、6次提交""
1 file changed, 1 insertion(+)
[master 509c208] Revert "Revert "第8次提交,revert 撤销第5、6次提交""
1 file changed, 1 insertion(+)
# 2.查看版本库历史提交记录
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git log --oneline
509c208 (HEAD -> master) Revert "Revert "第8次提交,revert 撤销第5、6次提交""
31341a4 Revert "Revert "第7次提交,revert 撤销第5、6次提交""
30f7626 Revert "第6次提交,revert 撤销第3次提交"
d0c8e48 Revert "第5次提交,revert 撤销第4次提交"
c04b29c 第4次提交,新增内容:revert test v4
fd819dc 第3次提交,新增内容:revert test v3
c71ae3c 第2次提交,新增内容:revert test v2
557f7c3 第1次提交,新增readme.txt文件
# 3.查看readme.txt文件内容,又回到V4版本了
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ cat readme.txt
revert test v1
revert test v2
revert test v3
revert test v4
我们可以看到,每撤销一个commit提交,都会生成一个新的提交。上面撤销了两个commit,就让你编写两次提交说明信息。
这时,错误的提交 commit-5
和 commit-6
依然保留,将来进行甩锅的时候也有依可循。而且,这样操作的话 HEAD 指针是往后移动的,可以直接使用 git push
命令推送到远程仓库里,而这种做法,正是企业所鼓励的。
(2)git revert
移除某几次连续的提交的修改
命令:git revert <commit新>...<commit旧>
(这里就不做演示了,同上)
注意:
- 含头不含尾,也就是撤销的提交,包含
<commit新>
,不包含<commit旧>
。 - 提交的顺序也是,最新的commit开头,然后往前到比较远的commit提交。
- 移除过程中如果有冲突:
不知道某次提交的修改内容,可以使用 git show 查看修改内容。
Git冲突的时候会提示当前要还原的commit的id是多少,如上error: could not revert d0c8e48... Revert "第5次提交,revert 撤销第4次提交"
。 - 过程中移除了几次提交的修改,也会相应的生成几次
revert commit
记录。
5、revert命令常用参数
(1)-n
参数
作用:git revert
命令移除某几次的提交的修改,但是不要使用还原的更改创建任何提交,还原只是修改工作树和索引。简写-n
,全称--no-commit
。
命令:git revert -n <commit新>...<commit旧>
(2)-m
参数
作用:git revert
移除merge(合并)的修改内容。
简写:-m parent-number
,全称:--mainline parent-number
。
命令:git revert [-m parent-number] <commit>
。
说明:
如果我们需要还原的提交的是merge的操作,直接使用 git revert <commit>
的方式是不行的,会提示我们:
error: commit ... is a merge but no -m option was given.
fatal: revert failed
因为merge操作有两个分支,而revert不知道要还原哪个分支的提交,就没法进行还原\移除那些提交记录的修改的操作了,所以我们用-m 1
来告诉git revert
命令哪个是主线,哪个是非主线。(选择主线就还原非主线,选择非主线就还原主线)
另外,这个主线是1还是2是从哪里看出来的呢?
我们可以使用 git show
命令查看,如果是普通的commit提交,通常会显示这个commit的id、作者、日期、备注、更改文件内容等;如果是merge的记录,则会显示merge 的commit-id,备注、日期和merge的主线和合并过来的id。
例如:
commit 63374e93eebd2b86882e5a4bb75dcd9d0e334b15
Merge: bc64f61 72032b7
Author: unknown [test@163.com](mailto:test@163.com)
Date: Sun Jul 19 11:34:21 2020 +0800
Merge branch ‘testcopy2’ into testcopy
如上第二行,Merge: bc64f61 72032b7
,bc64f61
就是主线的id,编号就是1;72032b7
就是非主线的id,编号就是2。
此时,我们要把合并过来的分支的修改给还原掉,那么就可以指定1为主线,还原掉2的提交了。
6、git revert
和git reset
命令的区别
git revert
命令是用一次新的commit来回滚之前的commit,git reset
命令是直接回滚到指定的commit。
即:git reset
命令是把HEAD向历史版本移动,而git revert
命令是把HEAD继续指向新的commit。- 在回滚这一操作上看,效果差不多。但是在日后继续merge(合并)以前的老版本时有区别。
因为git revert
命令是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch(分支)时,导致这部分改变不会再次出现。
但是git reset
命令是直接在某个分支上,回退到指定的commit,后边的提交不会在版本库的历史中(只能使用reflog
查看)。因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
通过以上对比可以发现,git reset
命令与 git revert
命令最大的差别就在于,git reset
命令会失去后面的提交,而 git revert
命令是通过反做的方式重新创建一个新的提交,而保留原有的提交。在企业里,应尽量使用 git revert
命令,能不用 git reset
命令尽量不用。
参考:
『现学现忘』Git后悔药 — 33、revert撤销(二)的更多相关文章
- 『现学现忘』Git后悔药 — 32、revert撤销(一)
目录 1.Git的三种后悔药 2.revert命令原理 3.revert命令的使用 (1)移除某次提交的修改 (2)revert命令说明 1.Git的三种后悔药 在Git中后悔药有三种:amend.r ...
- 『现学现忘』Git后悔药 — 34、git commit --amend 命令
目录 1.git commit --amend 命令说明 2.使用场景 (1)场景一 (2)场景二 3.git commit --amend 命令原理 这是我们Git中的第三种后悔药. 1.git c ...
- 『现学现忘』Git后悔药 — 27、版本回退介绍
目录 1.什么版本回退 2.需要了解两个知识点 (1)HEAD是什么 (2)HEAD指针用法 3.git reflog命令介绍 1.什么版本回退 版本回退也可以叫回滚. 若修改过的文件,不仅添加到了暂 ...
- 『现学现忘』Git后悔药 — 28、版本回退git reset --soft命令说明
git reset --soft commit-id命令:回退到指定版本.(soft:柔软的) 该命令仅仅修改分支中的HEAD指针的位置,不会改变工作区与暂存区中的文件的版本. 实现上是只做了一件事情 ...
- 『现学现忘』Git后悔药 — 29、版本回退git reset --mixed命令说明
git reset --mixed commit-id命令:回退到指定版本.(mixed:混合的,即:中等回退.) 该命令不仅修改了分支中HEAD指针的位置,还将暂存区中数据也回退到了指定版本. 但是 ...
- 『现学现忘』Git后悔药 — 30、版本回退git reset --hard命令说明
git reset --hardcommit-id命令:回退到指定版本.(hard:强硬,严格的回退) 该命令不仅移动了分支中HEAD指针的位置,还将工作区和暂存区中数据也回退到了指定的版本. (提示 ...
- 『现学现忘』Git后悔药 — 31、reset版本回退命令总结
目录 1.--soft回退说明 2.--mixed回退说明 3.--hard回退说明 4.总结 在Git中进行版本回退需要使用git reset命令. 以前面文章中的示例为例,当我准备在V4版本,回退 ...
- 『现学现忘』Git基础 — 5、Git的协作模式
目录 1.分布式工作流程 2.集中式工作流 3.分支工作流 4.GitFlow 工作流(最流行) 5.Forking 工作流(偶尔使用) 6.总结 1.分布式工作流程 与传统的集中式版本控制系统(CV ...
- 『现学现忘』Git基础 — 23、Git中的撤销操作
目录 1.撤销操作说明 2.撤销工作区中文件的修改 3.撤销暂存区中文件的修改 4.总结 1.撤销操作说明 我们在使用Git版本管理时,往往需要撤销某些操作.比如说我们想将某个修改后的文件撤销到上一个 ...
随机推荐
- PHP操作路由器
用PHP操作路由器 我们经常会碰到需要自动换IP的需求,比方模拟点击投票,数据采集被封IP,Alexa作弊等等,也就是需要经常换IP的,我们都可以通过PHP控制路由器来换IP,这样就不需要用按键精灵搞 ...
- PHP反向代理(转)
<?php class PhpReverseProxy{ public $publicBaseURL; public $outsideHeaders; public $XRequestedWit ...
- Nginx 浏览器缓存配置指令
# 浏览器缓存 # 当浏览器第一次访问服务器资源的时候,服务器返回到浏览器后,浏览器进行缓存 # 缓存的大概内容有: # 1.缓存过期的日期和时间 # 2.设置和缓存相关的配置信息 # 3.请求资源最 ...
- Java学习(一)MarkDown语法
Java学习(一)MarkDown语法 一.标题语法 一级标题 一级标题前添加一个#号 二级标题 二级标题前添加两个#号 三级标题 三级标题前添加三个#号 ... 二.字体 1.粗体 hello wo ...
- cad工具快速选择特性里面是空的解决方法
工具-选项-文件中,支持文件搜索路径中 添加,再浏览,找到"C:\Program Files\Common Files\Autodesk Shared"确定就OK了.
- SpringCloud之nacos
以下是官网文档中个人感兴趣的部分整理,官方完整文档链接如下: Nacos 官方文档 1.nacos是什么? 1.1 概念:快速实现动态服务发现.服务配置.服务元数据及流量管理. 简单来说就是发现.配置 ...
- Vue组件的继承用法
Vue组件的继承用法 点击打开视频讲解 vue组件的继承适用于UI几乎一样,只是数据不一样的情况下,但是这种情况通过统一封装组件也是能实现的,小功能建议用封装,大功能建议用组件继承,因为大功能在结合搜 ...
- C#基础_枚举
一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. ...
- 快速搭建 SpringCloud Alibaba Nacos 配置中心!
Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录.而 Nacos 作为 Spring Cloud Alibaba 的核心 ...
- Rust 从入门到精通06-语句和表达式
1.语句和表达式 语句和表达式是 Rust 语言实现逻辑控制的基本单元. 在 Rust 程序里面,语句(Statement)是执行一些操作但不返回的指令,表达式(Expressions)计算并产生一个 ...