• 技术文章 >开发工具 >git

    git中reset和revert的区别是什么

    青灯夜游青灯夜游2021-11-30 14:58:15原创11665

    区别:1、reset是彻底回退到指定的commit版本,该commit后的所有commit都将被清除;而revert仅是撤销指定commit的修改,并不影响后续的commit。2、reset执行后不会产生记录,revert执行后会产生记录。

    本教程操作环境:Windows7系统、Git2.30.0版、Dell G3电脑。

    git是我们常用的版本管理工具,我们团队在合作开发项目时,时常会因为代码及文件的修改提交,导致各种各样的冲突,还有产品需求的频繁变更,致使我们不得不做出回退版本,撤回提交这样的决定,那么此时,reset和revert命令,就派上了用场!

    reset,revert都有撤销、回退的意思,但却各有千秋,区别还是很大的,所以该使用哪种命令一定要结合实际情况来决定,本文就是带大家搞清楚两者的区别,然后能准确快速的使用正确的命令去解决实际问题!

    下面的例子中,我有3次提交:
    初始状态,只有readme一个文件,内容为Creating a new branch is quick.
    t1提交后状态:只有readme一个文件,内容修改为Creating a new branch is quick 1.
    t2提交后状态:只有readme一个文件,内容修改为Creating a new branch is quick 1 2.
    t3提交后状态:新增了test文件.

    本文以git bash为例:

    在这里插入图片描述
    先说reset

    reset,使用方法:git reset --hard commit ,commit是提交后产生的SHA1,执行该命令后,代码会完全回退到本次提交时的状态,工作暂存区以及本次提交后面的提交内容将会被完全清除,包括提交记录!

    举例:

    原项目,包含一个Readme.txt文件:
    在这里插入图片描述
    文件内容:
    在这里插入图片描述
    此时我将修改文件内容为:

    Creating a new branch is quick 1.

    进行第一次提交
    在这里插入图片描述
    提交记录:
    在这里插入图片描述
    提交后的远程仓库目录及文件内容:

    在这里插入图片描述在这里插入图片描述
    没有问题,继续修改文件内容:Creating a new branch is quick 1 2. ,进行第二次提交
    在这里插入图片描述
    现在我将新增一个test文件,进行第三次提交
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

    好了,现在产品需求变更了,新增的功能(readme的第二次修改和新增的test文件)不需要了,要求回退到第一次提交“t1”,如果我们选择使用reset:

    首先定位到t1的commit,可以从远程仓库提交历史记录中复制,也可以用命令git log查看:

    在这里插入图片描述
    (小提示,如果最后一行出现“:”,则输入wq退出回到命令行即可!)

    复制commit,执行命令:

    git reset --hard 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2

    在这里插入图片描述

    提示,HEAD已经指向了t1,但你刷新后台时,发现并没有什么变化,这是因为我们还需要执行一下push,但这里需要注意的是,因为本地代码回到了旧版本,但远程仓库是新版本和本地不一致,所以你在用git push时会报错,这里我们需要使用强制提交,git push -f,我们也可以使用git status查看当前状态:

    在这里插入图片描述

    意思是告诉你,远程仓库代码较新,需要你执行 git pull操作以同步代码,但这并不是我们的需求,所以我们不用理会,执行,git push -f

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/94c3e93f6efe40b6a4d12d02eb05cd4d.png

    再看仓库:

    在这里插入图片描述

    历史记录只剩下了t1:

    在这里插入图片描述

    readme内容也得到了恢复:

    在这里插入图片描述

    可见,reset是彻彻底底的回退,该commit之后的所有修改将完全消失,包括提交记录。

    优点

    缺点

    再说revert

    revert执行后会产生新的commit记录,是通过一次新的commit来恢复到之前旧的commit,但revert会保留恢复的该次提交后面的其它提交内容,假如后面的提交与要恢复的提交更改了同一地方,此时用revert就会产生冲突!

    我们继续以上面的例子为例,我重新执行了t2和t3提交,恢复到reset之前的状态:

    在这里插入图片描述
    在这里插入图片描述
    此时,我们按reset的思路,使用revert恢复到t1,执行命令:

    git revert 8cbf16c0821d20fe42c361f4e3d75a0493dc5fc2

    报错:

    在这里插入图片描述
    提示冲突了?让我们解决掉冲突后提交…

    <<<<<<< HEAD
    Creating a new branch is quick 1 2.
    =======
    Creating a new branch is quick.
    >>>>>>> parent of 8cbf16c (t1)

    上面的冲突表示,当前的内容是:

    Creating a new branch is quick 1 2.

    而我们要恢复的内容是:

    Creating a new branch is quick.

    如果对revert命令没有深入了解的话,就可能会产生疑惑,为什么会冲突?而且我实际上是想像reset一样恢复或者说是回退到t1(这里要再次说明一下t1的状态:只有一个readme文件,且内容是Creating a new branch is quick 1),但为什么冲突提示要恢复到Creating a new branch is quick.???这不是初始状态吗?

    其实,准确来说,revert是撤销/撤回/反提交的意思,我们不能按reset的思路理解,我们执行git revert t1,这么做其实结果是要撤销t1的提交,注意,仅仅是撤销t1的提交,把t1的修改恢复到t1之前也就是初始的状态,而不会影响t2,t3的提交。但如果t2,t3中修改了t1修改的同一地方,那么就会产生冲突,因为revert意图撤销t1的修改,但发现t2和t3把t1的修改再次修改了,此时,revert意图变得不清晰,因为它无法确定到底是应用你最新的修改,还是恢复到初始状态,这将由你来决定!

    所以我们想要恢复t1的状态,那我们就应该撤销t2对t1的修改git revert t2

    git revert fc4889dcb327cff9f8078db6a0d5c601b8e91ae9

    执行后会自动进入编辑界面:

    在这里插入图片描述

    这里需要我们修改或输入提交日志,按 “i”,进入输入状态,写完后按ESC退出输入状态,再按“:wq”退出!

    成功后,执行 git push:

    在这里插入图片描述

    查看仓库后台:

    在这里插入图片描述

    项目目录:

    在这里插入图片描述

    readme内容:

    在这里插入图片描述

    可见,revert操作成功后,产生了新的commit记录,t2对t1的修改已经恢复,现在的readme就是t1提交后的状态,但同时test文件仍然存在,即t3的提交不受影响!

    但如果你说,想要和reset一样,把t2t3的提交也要删除掉,那你就先revert t3,再revert t2,可以达到同样的效果,但这样一来,为何不直接用reset?如果你说既想达到reset的效果,又想有记录防止反悔,那这。。。是一个值得思考的问题!

    git reset和revert区别的总结:

    理清了reset和revert的基本原理,你就明白了在什么时间该使用哪个命令更为合适了!

    小提示:在IDEA开发工具中,选中一个文件,右键git选项中会发现有一个Rollback

    在这里插入图片描述
    这里需要跟reset和revert区分一下,rollback并不属于git命令,它的作用是,在文件或代码修改后,但还未commit,想恢复到与远程仓库代码一致的状态,便可以执行rollback操作!

    推荐学习:《Git教程

    以上就是git中reset和revert的区别是什么的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:git reset revert
    上一篇:myeclipse怎么安装git插件 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • git怎么取消commit• git和gerrit有什么区别• git 克隆失败怎么办• git pull和git clone有什么区别• git pull命令的用法是什么
    1/1

    PHP中文网