提示:接上一篇文章。

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-5commit-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 72032b7bc64f61 就是主线的id,编号就是1;72032b7就是非主线的id,编号就是2。

此时,我们要把合并过来的分支的修改给还原掉,那么就可以指定1为主线,还原掉2的提交了。

6、git revertgit reset命令的区别

  1. git revert命令是用一次新的commit来回滚之前的commit,git reset命令是直接回滚到指定的commit。

    即:git reset 命令是把HEAD向历史版本移动,而git revert命令是把HEAD继续指向新的commit。
  2. 在回滚这一操作上看,效果差不多。但是在日后继续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撤销(二)的更多相关文章

  1. 『现学现忘』Git后悔药 — 32、revert撤销(一)

    目录 1.Git的三种后悔药 2.revert命令原理 3.revert命令的使用 (1)移除某次提交的修改 (2)revert命令说明 1.Git的三种后悔药 在Git中后悔药有三种:amend.r ...

  2. 『现学现忘』Git后悔药 — 34、git commit --amend 命令

    目录 1.git commit --amend 命令说明 2.使用场景 (1)场景一 (2)场景二 3.git commit --amend 命令原理 这是我们Git中的第三种后悔药. 1.git c ...

  3. 『现学现忘』Git后悔药 — 27、版本回退介绍

    目录 1.什么版本回退 2.需要了解两个知识点 (1)HEAD是什么 (2)HEAD指针用法 3.git reflog命令介绍 1.什么版本回退 版本回退也可以叫回滚. 若修改过的文件,不仅添加到了暂 ...

  4. 『现学现忘』Git后悔药 — 28、版本回退git reset --soft命令说明

    git reset --soft commit-id命令:回退到指定版本.(soft:柔软的) 该命令仅仅修改分支中的HEAD指针的位置,不会改变工作区与暂存区中的文件的版本. 实现上是只做了一件事情 ...

  5. 『现学现忘』Git后悔药 — 29、版本回退git reset --mixed命令说明

    git reset --mixed commit-id命令:回退到指定版本.(mixed:混合的,即:中等回退.) 该命令不仅修改了分支中HEAD指针的位置,还将暂存区中数据也回退到了指定版本. 但是 ...

  6. 『现学现忘』Git后悔药 — 30、版本回退git reset --hard命令说明

    git reset --hardcommit-id命令:回退到指定版本.(hard:强硬,严格的回退) 该命令不仅移动了分支中HEAD指针的位置,还将工作区和暂存区中数据也回退到了指定的版本. (提示 ...

  7. 『现学现忘』Git后悔药 — 31、reset版本回退命令总结

    目录 1.--soft回退说明 2.--mixed回退说明 3.--hard回退说明 4.总结 在Git中进行版本回退需要使用git reset命令. 以前面文章中的示例为例,当我准备在V4版本,回退 ...

  8. 『现学现忘』Git基础 — 5、Git的协作模式

    目录 1.分布式工作流程 2.集中式工作流 3.分支工作流 4.GitFlow 工作流(最流行) 5.Forking 工作流(偶尔使用) 6.总结 1.分布式工作流程 与传统的集中式版本控制系统(CV ...

  9. 『现学现忘』Git基础 — 23、Git中的撤销操作

    目录 1.撤销操作说明 2.撤销工作区中文件的修改 3.撤销暂存区中文件的修改 4.总结 1.撤销操作说明 我们在使用Git版本管理时,往往需要撤销某些操作.比如说我们想将某个修改后的文件撤销到上一个 ...

随机推荐

  1. DBPack SQL Tracing 功能及数据加密功能详解

    上周,我们正式发布了 DBPack SQL Tracing 功能和数据加密功能,现对这两个功能做如下说明. SQL Tracing 通过 DBPack 代理开启的全局事务,会自动在 http head ...

  2. gitlab root密码重置

    版本:Gitlab Ruby Gem 4.16.1 root密码在gitlab第一次运行的时候,如果你没有配置root用户的密码文件,它就会生成一个随机密码,并保存在固定的文件中,然后输出在屏幕上.但 ...

  3. Apache DolphinScheduler 1.3.6 功能发布说明

    参与人员 @chengshiwen.@hailin0.@wanghong1314.@ruanwenjun.@xxjingcd.@zhangguohao.@zhuangchong.@syb8535531 ...

  4. Spring 02 控制反转

    简介 IOC IOC(Inversion of Control),即控制反转. 这不是一项技术,而是一种思想. 其根本就是对象创建的控制权由使用它的对象转变为第三方的容器,即控制权的反转. DI DI ...

  5. 项目一共30个模块,你叫我maven版本一个个手动改?

    大家好呀,我是铂赛东,一个乱入公众号博主的开源作者.今天分享一个maven小技巧,希望帮助到大家. 之前有个群友私聊问我,如何快速统一去更改项目中所有的maven版本号,他说之前都是手动一个个去修改, ...

  6. 【MySQL】从入门到掌握1-一些背景知识

    这个系列的文章带各位学习MySQL数据库. 不需要任何基础知识,便可以学习. 学习MySQL对学习Java的JDBC有很大的好处! 想要开发游戏服务器,那么学习MySQL也是必不可少的. 学习完本系列 ...

  7. python筛选excel内容并生成exe文件

    最近疫情原因,班级每天都要筛选未打卡人员,每次都手动操作太麻烦了.遂写下如下的程序,并且生成了exe可执行文件. 1. 主程序 import openpyxl import pyperclip # 1 ...

  8. 【设计模式】Java设计模式 - 动态代理

    [设计模式]Java设计模式 - 动态代理 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 最近工作比较忙,没啥时间学习 目录 [设计模 ...

  9. vscode主题开发

    vscode主题开发教程 https://blog.csdn.net/Suwanqing_su/article/details/105945290 个人配置结果 主题代码 到Vscode放插件的目录中 ...

  10. C语言001--hello world编译详解

    1.编写hello.c程序,并编译运行 book@100ask:~/linux/c01$ cat hello.c -n 1 #include <stdio.h> 2 3 int main( ...