面试官:说说你对Git Reset 和 Git Revert 的理解?区别?

开源
在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化,不会改变过去的历史,主要是用于安全地取消过去发布的提交.

本文转载自微信公众号「JS每日一题」,作者灰灰 。转载本文请联系JS每日一题公众号。

 一、是什么

git reset

reset用于回退版本,可以遗弃不再使用的提交

执行遗弃时,需要根据影响的范围而指定不同的参数,可以指定是否复原索引或工作树内容

git revert

在当前提交后面,新增一次提交,抵消掉上一次提交导致的所有变化,不会改变过去的历史,主要是用于安全地取消过去发布的提交

二、如何用

git reset

当没有指定ID的时候,默认使用HEAD,如果指定ID,那么就是基于指向ID去变动暂存区或工作区的内容

  1. // 没有指定ID, 暂存区的内容会被当前ID版本号的内容覆盖,工作区不变 
  2. git reset 
  3.  
  4. // 指定ID,暂存区的内容会被指定ID版本号的内容覆盖,工作区不变 
  5. git reset <ID> 

日志ID可以通过查询,可以git log进行查询,如下:

  1. commit a7700083ace1204ccdff9f71631fb34c9913f7c5 (HEAD -> master) 
  2. Author: linguanghui <linguanghui@baidu.com> 
  3. Date:   Tue Aug 17 22:34:40 2021 +0800 
  4.  
  5.     second commit 
  6.  
  7. commit e31118663ce66717edd8a179688a7f3dde5a9393 
  8. Author: linguanghui <linguanghui@baidu.com> 
  9. Date:   Tue Aug 17 22:20:01 2021 +0800 
  10.  
  11.     first commit 

常见命令如下:

  • --mixed(默认):默认的时候,只有暂存区变化
  • --hard参数:如果使用 --hard 参数,那么工作区也会变化
  • --soft:如果使用 --soft 参数,那么暂存区和工作区都不会变化

git revert

跟git reset用法基本一致,git revert 撤销某次操作,此次操作之前和之后的 commit和history都会保留,并且把这次撤销,作为一次最新的提交,如下:

 

  1. git revert <commit_id> 

如果撤销前一个版本,可以通过如下命令:

  1. git revert HEAD 

撤销前前一次,如下:

  1. git revert HEAD^ 

三、区别

撤销(revert)被设计为撤销公开的提交(比如已经push)的安全方式,git reset被设计为重设本地更改

因为两个命令的目的不同,它们的实现也不一样:重设完全地移除了一堆更改,而撤销保留了原来的更改,用一个新的提交来实现撤销

两者主要区别如下:

  • git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit
  • git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容
  • 在回滚这一操作上看,效果差不多。但是在日后继续 merge 以前的老版本时有区别

git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,之前提交合并的代码仍然存在,导致不能够重新合并

但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入

如果回退分支的代码以后还需要的情况则使用git revert, 如果分支是提错了没用的并且不想让别人发现这些错误代码,则使用git reset

参考文献

https://juejin.cn/post/6844903542931587086

https://marklodato.github.io/visual-git-guide/index-zh-cn.html#reset

 

责任编辑:武晓燕 来源: JS每日一题
相关推荐

2021-08-17 07:15:16

Git RebaseGit Merge面试

2021-08-09 07:47:40

Git面试版本

2022-02-10 09:56:33

git revertgit resetGit

2015-08-20 10:42:17

2021-08-16 08:33:26

git

2020-10-27 07:31:35

GitGit RevertGit Reset

2021-11-25 10:18:42

RESTfulJava互联网

2020-12-01 08:47:36

Java异常开发

2020-06-12 15:50:56

options前端服务器

2021-08-12 07:49:25

Git 索引HEAD

2021-11-08 11:32:01

观察

2021-09-16 07:52:18

算法应用场景

2021-08-11 08:53:23

Git命令面试

2021-10-15 09:53:12

工具

2021-09-07 08:33:27

JavaScript TypeScript 函数

2019-05-10 10:50:04

Spring AOPJDK动态代理CGLIB动态代理

2021-11-09 08:51:13

模式命令面试

2020-12-04 06:27:04

序列化面试官Java

2021-11-05 07:47:56

代理模式对象

2021-11-02 22:04:58

模式
点赞
收藏

51CTO技术栈公众号