reset revert

1. 是什么

2. 如何使用

3. 区别

答:

1.git reset

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

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

2. git revert

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

2.git reset

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

// 没有指定ID, 暂存区的内容会被当前ID版本号的内容覆盖,工作区不变
git reset

// 指定ID,暂存区的内容会被指定ID版本号的内容覆盖,工作区不变
git reset <ID> 

常见命令如下:

git revert

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

git revert <commit_id> 

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

git revert HEAD

撤销前前一次,如下:

git revert HEAD^

3. 区别

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

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

两者主要区别如下:

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

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

补充

补充:三组易混命令对比速记:

  • git revert <commit>:生成一次新的反向 commit 抵消指定提交,保留历史,安全用于已推送的公共分支。
  • git reset <commit>:回退 HEAD 指针,--soft 保留暂存区,--mixed(默认)重置暂存区,--hard 把工作区也回退。会改写历史,慎用于已推送分支。
  • git checkout <commit> / git checkout -- file:前者切换 HEAD(也可切换分支),后者放弃工作区某文件的修改。
  • git restore(git 2.23+):是 checkout 的"语义化拆解",restore --staged = reset(暂存区回退),restore <file> = 放弃工作区修改。

来源整理自:我的有道云笔记