Git 中回退有 resetrevert,这两个的区别就是是否保留更改记录

假设当前的提交情况是:A <- B <- C <- D <- HEAD,如下图:

当前是 D,希望回退到 A,那我们可以使用 reset 命令,reset 后再看 git log 就会发现:B <- C <- D 宛如没有出现过,这适用于想完全舍弃 A 之后的修改

但是如果我们想保留 B <- C <- D 的修改记录,可能这三个 commit 的功能只是暂时用不到,以后可能还用到,或者可能当前分支是一个公共分支,B <- C <- D 可能已经被同步到了其他小伙伴电脑上,为了尽量避免代码冲突。这些情况就需要使用 revert 命令,这样会重新生成新的 commit,其中包含回退的记录(假设 D 这个 commit 是添加了一些代码,那么 revert D 的 commit 就是删除这些代码)

reset

使用 git reset A ,reset 会修改 head 的指向,这样可以回滚到 A,默认使用的参数是 --mixed,这个参数决定了 reset 时 Git 该如何处理工作区和暂存区

一般地,我们对于代码的修改会体现在 working tree(工作区)的变动,通过 git add 添加即将要提交的文件到 index(暂存区),通过 git commit 再提交到 repository(本地仓库),如下图:

查看帮助:git help reset

 git reset [<mode>] [<commit>]
This form resets the current branch head to <commit> and possibly updates the index (resetting it to the
tree of <commit>) and the working tree depending on <mode>. If <mode> is omitted, defaults to --mixed. The
<mode> must be one of the following: --soft
Does not touch the index file or the working tree at all
--mixed
Resets the index but not the working tree
--hard
Resets the index and working tree

假设我们现在处在 D,那么分别会有三种 reset 的情况

  • 我们执行 git reset --soft A,字面意思,轻柔地 reset,只将 repository 回滚到了 A,而 working treeindex 维持 reset 之前的状态,保持不变,这个时候直接执行 commit,这时候会得到一个和 D 修改内容相同的 commit D'(二者的 commit id 是不相同的),--soft 很适合呈现多次 commit 的修改的叠加效果,假设 BCD 都是针对某一个功能的修改,其中的 commit 可能修改了同一个文件,想整合这些 commit 都修改了哪些内容,就可以使用 --softD reset 到 A,那么 BCD 的修改都会出现在 index



  • 我们执行 git reset --mixed Arepositoryindex 会回滚,working tree 维持 reset 之前的状态,这个时候直接 commit,将无法提交,因为 repositoryindex 都被回滚了,二者是相同的,没有变化则无法提交 commit



  • 我们执行 git reset --hard A,按照参数 hard 的字面意思,reset 的非常强硬,repositoryindexworking tree 都会回滚到 A,因为 working tree 工作区也回滚了,所以本地的所有修改也将丢失,--hard 相对来说比较危险,需要确保工作区没有需要保留的代码,--hard 适合的情况是对于当前的即将要提交的代码失去信心,准备推倒重来



revert

如果想在回滚的同时保留 commit 记录,就需要使用 revert,revert 就是生成原 commit 逆向修改的 commit,从而实现会滚。当前是 D,希望回退到 A,就需要按顺序依次 revert DCB

git revert D

git revert C

git revert B

每一次 revert 都会生成新的 commit,需要依次手动输入 commit message,也可以先 revert 最后集中 commit

git revert --no-commit D
git revert --no-commit C
git revert --no-commit B
git commit -m " Revert D C B"

使用 revert 需要注意,如果即将 revert 的 commit 是一个 merge commit,那么会出现错误

使用 reset 方式,创建回滚的 commit

如果需要保留回滚记录,但是需要 revert 的 commit 是 merge commit,那就必须手动指定 mainline,比较麻烦,可以用 reset 的方式创建回滚 commit,这种方式不受 merge 方式的影响:

git reset --hard A
git reset --soft D git commit -m " Revert D C B"

通过这种方式也能回滚回 A,并且生成一个新的 commit,其中包括了 DCB 的逆向修改:

  1. reset --hardA,这时 repositoryindexworking tree 都会回滚到 A



  2. reset --softD,这时 repository 指向了 D,但是 indexworking tree 还保持在 A,当前即将 commit 的就是 BCD 逆向修改的叠加



参考资料

Pretty Git branch graphs

git revert 用法

git reset soft,hard,mixed之区别深解

What's the difference between git reset --mixed, --soft, and --hard?

How can I revert multiple Git commits?

Understanding Git — Index


相关阅读:Git 常见操作梳理

Git 中的回退操作:reset 和 revert的更多相关文章

  1. 大话git中的撤销操作

    下面以现实场景作为情境. 基础知识,理解git中的几个区域 本地代码已经add,未commit 修改本地工作目录中的readme.md,添加文字"第一次修改" 然后查看下状态 ➜ ...

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

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

  3. git中的文件操作

    现在我们的机器上有了一个 真实项目 的 Git 仓库,并从这个仓库中检出了所有文件的 工作副本. 通常,你会对这些文件做些修改,每当完成了一个阶段的目标,想要将记录下它时,就将它提交到仓库. git中 ...

  4. git中通过实际操作来了解常用命令

    基本的6个命令 常用的就下面6个命令,但是详细的可能有上百个命令. 还需要特别了解git的几个名词,workspace:工作区,Index/Stage:暂存区,Respository:本地仓库,Rem ...

  5. Git 中的一些其他常用命令

    1.查看提交的历史版本(git log) 我们可以使用 git log 命令来查看提交的历史版本. 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排在最上面.每个版本都有 ...

  6. Git命令之回退篇 git revert git reset

    Git command之回退篇 欲练回退 必先了解:HEAD.index.WorkingCopy HEAD: 当前所在的分支版本顶端的别名,也就是最新的一次commit. git commit 之后与 ...

  7. git中reset与revert的使用

    http://alpha-blog.wanglianghome.org/2010/07/30/git-partial-rollback/ reset(版本撤回) 格式 git reset [-q] [ ...

  8. Git回退---reset和revert

    今天学习了git回退的两个命令,现在总结一下: 1.git reset 如果想回退错误的提交C和D,只要把指针移到B上 git reset --hard a0fvf8 而这时候,远程仓库的指针还在D上 ...

  9. git reset 版本回退操作

    1 git回退命令 git reset --hard GIT_HEAD   GIT_HEAD是你具体要回退的分支: 如图:   注:  查询GIT_HEAD可以通过两个命令:git log 获取未删除 ...

随机推荐

  1. netty系列之:netty中的核心编码器base64

    目录 简介 netty codec的实现逻辑 netty中Base64的实现 netty中的base64编码和解码器 Base64Encoder Base64Decoder 总结 简介 我们知道数据在 ...

  2. nginx反向代理隐藏端口号和项目名

    可利用nginx反向代理隐藏端口号和项目名,直接输入ip即可访问对应的tomcat项目,配置nginx安装目录的nginx/conf/nginx.conf文件,修改如下:(开了两个web项目:项目名为 ...

  3. 大一/初学者学C语言前必看!!!(建议收藏)

    目录 数据类型 常量.变量 数组 字符串.转义字符 选择语句 循环语句 函数 操作符 结构体 指针 神秘的学习资料基地​jq.qq.com/?_wv=1027&k=5kWJsY1z 一.数据类 ...

  4. Halo 开源项目学习(五):评论与点赞

    基本介绍 博客系统中,用户浏览文章时可以在文章下方发表自己的观点,与博主或其他用户进行互动,也可以为喜欢的文章点赞.下面我们一起分析一下 Halo 项目中评论和点赞功能的实现过程. 发表评论 评论可以 ...

  5. HTML5 Canvas 超逼真烟花绽放动画

    各位前端朋友们,大家好!五一假期即将结束,在开启加班模式之前,我要给大家分享一个超酷超逼真的HTML5 Canvas烟花模拟动画.这次升级版的烟花动画有以下几个特点: 烟花绽放时,将展现不同的色彩,不 ...

  6. 3.yum学习笔记

    一.yum介绍 将所有的rpm软件包放到指定服务器上,当进行yum在线安装时,可以自动解决依赖性问题. yum配置文件常位于/etc/yum.repo.d 目录下 [root@aaa251 ~]# c ...

  7. 8 种常见 SQL 错误用法

    点击上方"开源Linux",选择"设为星标"回复"学习"获取独家整理的学习资料! 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常 ...

  8. OpenHarmony 3GPP协议开发深度剖析——一文读懂RIL

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)本文转载自:https://harmonyos.51cto.com/posts/10608 夏德旺 软通动力信息技术(集 ...

  9. Mybatis-Plus入门实践

    简介 Mybatis-Plus 简称 MP ,是 Mybatis 的增强工具,提供了一批开箱即用的功能.特性.接口.注解,简化了应用程序访问数据库的相关操作,完善了Mybatis作为ORM仅能做到半自 ...

  10. 使用MinIO搭建对象存储服务

    1.MinIO是什么? MinIO 是一款高性能.分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件.即X86等低成本机器也能够很好的运行MinIO. MinIO与传统的存储和其 ...