1、Git的三种后悔药

在Git中后悔药有三种:amendrevertreset

  • git commit --amend:新的提交覆盖上一次提交的内容。
  • git revert:提交一个新的commit,来撤销之前的commit
  • git reset:直接回滚到指定的commit

    --soft:只回退版本库,工作区和暂存区的内容不回退。

    --mixed(默认):回退版本库和暂存区,工作区中的内容不回退。

    --hard:工作区,暂存区,版本库中的内容都回退到指定的提交。(危险的)

提示:之前我们把git reset命令说完了,git commit --amend命令我们下一篇文章说。这篇文章来说git revert命令。

2、revert命令原理

在我们使用Git的操作中,遇到需要回滚代码的情况几乎是难以避免的,而 git revert 命令是一个非常实用的功能,掌握好 git revert 命令的使用是很有必要的。

git revert命令:是用于“反做”某一个版本,以达到撤销该版本的修改的目的。

比如,我们提交了三个版本,突然发现版本二不行(如:有bug),想要撤销版本二,但不想或不需要撤销版本三提交,就可以用 git revert 命令来反做版本二,同时生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。

但注意:版本二的历史提交记录是不会删除的。

如下图所示:

提示:注意是revert命令撤回某个改动,不是reset命令撤回到某个改动。另外,这条命令不会删除任何commit记录,而是会新增一条revert操作的commit记录(会弹出commit message的编辑窗口)。

3、revert命令的使用

现有一个版本库,其中有4次提交,版本库的历史提交记录如下:

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git log --oneline
c04b29c (HEAD -> master) 第4次提交,新增内容:revert test v4
fd819dc 第3次提交,新增内容:revert test v3
c71ae3c 第2次提交,新增内容:revert test v2
557f7c3 第1次提交,新增readme.txt文件

我们发现第三次提交和第四次提交有错误,需要撤销。

如下图:

(1)移除某次提交的修改

commit-1commit-2 是正常提交,而 commit-3commit-4 是错误提交。现在,我们想把 commit-3commit-4 撤销掉。而此时,HEAD 指针指向 commit-4 提交(c04b29c)。我们只需将 HEAD 指针移动到commit-2 提交(c71ae3c),就可以达到目的。

我们一定会想到之前学过的 git reset 命令。执行命令git reset --hard c71ae3c,就可以退回到 commit-2 提交。

采用这种方式回退代码的弊端显而易见,那就是会使 HEAD 指针往回移动,从而会失去之后的提交信息。将来如果突然发现, commit-3commit-4 是多么绝妙的想法,可它们已经早就消失在历史的长河里了(但是通过reflog也能找回来)。

而且,有些公司明令禁止使用 git reset 命令去回退代码,原因与上述一样。所以,我们需要找到一个命令,既可以回退代码,又可以保存错误的提交。这时 git revert 命令就派上用场了。

命令:git revert <commit>

演示:

# 1.撤销第四次提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git revert c04b29c
[master d0c8e48] Revert "第5次提交,revert 撤销第4次提交"
1 file changed, 1 deletion(-) # 之后会弹出一个编辑文本框,来让你写新生成提交的注释,如下图。 # 2.查看版本库历史提交记录
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git log --oneline
d0c8e48 (HEAD -> master) Revert "第5次提交,revert 撤销第4次提交"
c04b29c 第4次提交,新增内容:revert test v4
fd819dc 第3次提交,新增内容:revert test v3
c71ae3c 第2次提交,新增内容:revert test v2
557f7c3 第1次提交,新增readme.txt文件
# 可以看到第4次提交的commit依然存在。 # 3.查看readme.txt文件内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ cat readme.txt
revert test v1
revert test v2
revert test v3
# 可以看到V4 版本内容已经没有了。

如下图所示:

这里需要说明一下:

git revert命令的作用通过反做创建一个新的版本,这个版本的内容与我们要回退到的目标版本一样,但是HEAD指针,是指向这个新生成的版本,而不是目标版本。

使用 git revert 命令来实现上述例子的话,我们可以这样做:先 revert commit-4,再 revert commit-3有多个提交需要回退的话需要由新提交到旧提及哦啊进行 revert)。

我们继续同样的操作步骤,把第三次提交也撤销掉。

# 1.撤销第3次提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git revert fd819dc
[master 30f7626] Revert "第6次提交,revert 撤销第3次提交"
1 file changed, 1 deletion(-) # 2.查看版本库历史提交记录
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文件 # 3.查看readme.txt文件内容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ cat readme.txt
revert test v1
revert test v2

通过上面练习,我们可以得出,git reset撤销和git revert撤销的区别,如下图所示:

(2)revert命令说明

git revert <commit>命令:

  1. 这个命令会生成一个新的提交记录,新的提交记录就是把需要移除的提交撤销掉,所生成的新提交。
  2. 如果工作区或暂存区还有修改未提交,那么会提示需要先提交或存储起来这些文件。
  3. 如果在移除的过程中发生了冲突,可以在解决了冲突后,使用 git add 命令添加修改的冲突文件到暂存区中,在使用 git revert --continue 来继续操作。

    如果不想继续操作,当然也可以使用 git revert --abort 命令来停止移除操作,恢复到执行git revert <commit>命令之前的状态。
  4. 如果revert移除的过程中出现冲突,需要把这些冲突解决才可以继续操作。我们可以使用 git revert --skip 命令来跳过一个commit的冲突解决。如果后续还有冲突,也同样如此进行跳过,直到全部冲突解决完成。

    但是使用git revert --skip 命令跳过的commit,将会在历史提交记录中被删除(reflog命令还是可以看到的),所以git rebase --skip 这个命令慎用。

拓展思路:

  • git revert HEAD:撤销前一次commit
  • git revert HEAD^:撤销前前一次commit

『现学现忘』Git后悔药 — 32、revert撤销(一)的更多相关文章

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

    目录 4.一次移除某几次提交 (1)git revert移除某几次提交的修改 (2)git revert 移除某几次连续的提交的修改 5.revert命令常用参数 6.git revert和git 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. Windows快捷安装应用方法(此处以Virtualbox为例)

    1.执行已下载的virtualbox的安装exe文件,使用pywinauto模拟点击Windows安装的对应控件 1.1.启动exe文件 start *.exe 1.2.使用pywinauto(也适用 ...

  2. Splash (渲染JS服务)介绍安装

    一. splash介绍 1.Splash 是一个带有 HTTP API 的 javascript 渲染服务.它是一个带有 HTTP API 的轻量级浏览器,使用 Twisted 和 QT5 在 Pyt ...

  3. 三菱模拟量输入模块FX3U-4AD与FX3U-4AD-ADP的区别

    三菱PLC模块 FX3U-4AD与FX3U-4AD-ADP同为三菱FX3U系列PLC的模拟量4通道电压/电流输入模块,其功能作用相同,在三菱FX3U系列PLC上使用起来也并无不同之处. 1.三菱PLC ...

  4. benchmark性能测试

    目录 benchmark介绍 benchmark运行 benchmark运行参数 benchmark性能测试案例 benchmark介绍 基准测试主要是通过测试CPU和内存的效率问题,来评估被测试代码 ...

  5. 开源图编辑库 NebulaGraph VEditor 的设计思路分享

    本文首发于 NebulaGraph 公众号 NebulaGraph VEditor 是一个拥有高性能.高可定制的所见即所得图可视化编辑器前端库. NebulaGraph VEditor 底层基于 SV ...

  6. 部署前后端为独立的 Docker 节点

    在『服务器部署 Vue 和 Django 项目的全记录』一文中,介绍了在服务器中使用 Nginx 部署前后端项目的过程.然而,当 Web 应用流量增多时,需要考虑负载均衡.流量分发.容灾等情况,原生的 ...

  7. MySQL事务概念与流程和索引控制

    MySQL事务概念与流程和索引控制 视图 1.什么是视图 我们在执行SQL语句其实就是对表进行操作,所得到的其实也是一张表,而我们需要经常对这些表进行操作,拼接什么的都会产生一张虚拟表,我们可以基于该 ...

  8. Centroids (换根DP)

    题面 题解 删一条边.加一条边,相当于把一个子树折下来,然后嫁接在一个点上, 那么最优的情况肯定是接在根上,对吧,很好理解吧 那么这个拆下来的子树大小就不能超过n/2. 我们用son[]来表示每个点为 ...

  9. 【Java】学习路径44-多线程入门篇

    这一章,我们学习线程的创建.线程的启动.线程的名字设置.线程的休眠.线程的加入.守护线程. 一个线程是一个单独的类的对象. 想让一个普通的类变成多线程,那么这个类需要继承Thread. 创建多线程的步 ...

  10. 【java】学习路线11-四种权限修饰的测试

    package com.remoo.test;public class Learn09_Test{    private static String welcomeWord1 = "你好,p ...