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

再看仓库:

历史记录只剩下了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的效果,又想有记录防止反悔,那这。。。是一个值得思考的问题!

总结:

  • reset是彻底回退到指定的commit版本,该commit后的所有commit都将被清除,包括提交历史记录;
  • revert仅仅是撤销指定commit的修改,并不影响后续的commit,但所撤销的commit被后续的commit修改了同一地方则会产生冲突;
  • reset执行后不会产生记录,revert执行后会产生记录;
  • reset执行后无法再次恢复,revert执行后因为不会清除记录,并且会产生新纪录,所以文件不会丢失,你可以多次执行revert恢复到某次改变之前的状态;
  • reset执行后HEAD会后移,而revert的HEAD则一直是向前的;

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

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

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

下一篇:一文理清项目中如何正确使用git

一文彻底搞清git reset和revert区别相关推荐

  1. Git Rebase vs Merge, GIt Reset vs Revert

    Git merge vs Rebase 构造场景如下: https://zhuanlan.zhihu.com/p/29682134?utm_source=wechat_session Git Rest ...

  2. git reset和revert

    reset: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法. 1.找到自己要修改的分支输入git log查看历史版本号 例如:deab40为最新版本 deab ...

  3. git checkout和git reset的一些区别以及配置git简写命令

    一.背景 在调试代码的时候,每次都要通过git上传到服务器调试,实在是一件很麻烦的事情.所以对于一些微小的改动,我就直接在服务器上修改.等调试成功之后,用git reset再回退到之前的版本,后来经过 ...

  4. Git撤销修改场景及对应指令(checkout、reset、revert)详解

    场景一:撤销工作区的修改(未执行git add) 指令:git checkout [目录或文件名] 实例: 1.修改了test.txt文档,git status 会出现如下提示: 2.git chec ...

  5. git版本回退(git reset、git revert、git stash)

    文章目录 回退的两种情况 1.已 commit,未push到远程仓库. 1.1 git reset --soft (撤销commit) 1.2 git commit --amend(修改commit ...

  6. git revert和git reset的区别

    git revert 是撤销某次操作,此次操作之前的commit都会被保留 git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区 具体一个例子,假设有三个commit, git s ...

  7. Git reset , revert, checkout的区别和联系

    转自: http://www.cnblogs.com/houpeiyong/p/5890748.html 拿来做个笔记 git reset.git checkout和git revert是你的Git工 ...

  8. Git恢复之前版本的两种方法reset、revert详解

    一.问题描述 在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset).反做(rev ...

  9. git reset和git revert

    前面一篇文章讲了,git reset --hard HEAD是快速撤销当前修改,今天再来学习一下git revert,然后对比git reset. git reset是回退到以前的某个commit时, ...

最新文章

  1. java第三章_Java 第三章
  2. 网上商城系统源代码_多用户系统商城授权有几种方式?
  3. HTML自学教程--一天搞定HTML(总结)
  4. python实现 多叉树 寻找最短路径
  5. gcc / -L 和 -Wl,-rpath 区别
  6. intellij2018使用2019的主题
  7. 【JEECG Docker安装】CentOS6下docker的安装和使用
  8. Oracle IMPDP导入数据案例之注意事项(undo/temp)
  9. Python -- abc module
  10. 华为厉害了:已启动6G网络技术研究
  11. hadoop yarn 集群配置
  12. JAVA中Long与Integer
  13. R语言地理探测器--因子探测器实现
  14. Python小甲鱼课后习题 乌龟吃小鱼
  15. 手把手教你使用Python提取快递信息
  16. JZOJ-senior-3502. 【NOIP2013模拟11.4B组】方格游戏
  17. 胃与十二指肠溃疡的食疗方
  18. c语言投影是什么,计算机c语言中什么是关系的投影运算
  19. python魔方方法超详细介绍
  20. 安装 arm nginx aarch64

热门文章

  1. 重庆大学和四川大学计算机考研,西南地区最好的4所大学, 重庆大学第三, 第一无争议, 第二最难考...
  2. [英语歌曲]Just one last dance
  3. Windows11华为eNSP模拟器 AR1路由器启动代码40 报错解决办法之一
  4. 达梦数据库 查询当前用户连接数命令
  5. 函数 void insert(char *s, char *t, int pos) 将字符串 t 插入到字符串 s 中,插入位置为 pos。请用 C 语言实现该函数。假设分配给字符串 s 的空间足够让
  6. java名言英文_十句与咖啡有关的人生格言,中英文双版本
  7. MyBatis学习--完整教程
  8. pycharm this license has been suspended
  9. 空间曲线曲率算法c语言,第一章第四节空间曲线曲率计算公式及推导.doc
  10. python datetime中strftime用法