git:git reset 和 git revert

在使用 git 进行项目开发的过程中,有时会出现错误提交的情况,这时就需要能够撤销错误的提交,将代码恢复到提交之前的样子。根据不同情况,可以使用 git reset 或 git revert 命令。

一. git reset

git reset 的原理是修改 HEAD 的位置,即将 HEAD 指向的位置改变为之前存在的某个版本。具体来说,git reset 的作用是将当前分支的 HEAD 指针指向指定的提交,同时将暂存区和工作区更新为该提交的状态。

git reset 命令有三个主要选项:

  1. --soft:将 HEAD 指针指向给定的提交,暂存区和本地源码不变,也就是说未保存的修改会保留下来。在三个选项中对现有版本库状态改动最小。简单来说,–soft 不会删除回退的代码,而是会将代码从 commit 回退到 add 之后的状态(暂存区)。如果回退之前的暂存区有提交,会和回退的版本合并,工作区代码不变。

  2. --mixed:将 HEAD 指针指向给定的提交,暂存区也会相应的回退,本地源码不变。简单来说,–mixed 不会删除回退的代码,而是会将代码从 commit 回退到 add 之前的状态(工作区)。如果回退之前的暂存区有提交,也会跟着回退到工作区,并与工作区的代码合并。

  3. --hard:将 HEAD 指针指向给定的提交,暂存区和本地源码也全部回退到指定的状态,所有的修改都会丢失,是最危险的一个参数。简单来说,使用 --hard 之后,会将代码回退到指定版本,同时清除工作区和暂存区的修改,所有未 commit 的代码都会被删除。

如果需要回退的修改还没有 git push 到远程仓库,那只需要在 git reset 之后继续开发正常提交就行。如果回退的版本已经 push 到远程仓库,回退之后需要git push -f强制提交一次,使远程仓库也回退到指定版本。但是在实际多人协同开发的过程中慎重使用,使用 git rest 回退到某个版本,可能会覆盖掉别人提交的代码。

git reset <commit-id>

git reset 命令默认使用 --mixed 参数。除了 commit-id 之外,还可以使用git reset HEAD~简写形式回退到上一个版本。

git reset 使用 commit-id 不仅可以回退到某个版本,还可以用来恢复到回退之前的版本。如果不记得 commit-id,可以通过git reflog查询。

二. git revert

git revert 的原理是创建一个新的提交,该提交是上一个提交的反向操作,以撤销该提交的更改。与 git reset 不同,git revert 不会改变提交历史,而是通过创建一个新的提交来撤销之前的更改,也不会改变暂存区和工作区的内容。

git revert <commit-id>

在执行 git revert 的过程中可能会出现版本冲突。对于每个冲突的文件,需要手动打开并编辑它们。Git会在冲突的文件中插入特殊的标记,指示冲突的位置。你需要删除这些标记,并决定如何解决冲突。解决冲突之后,需要提交冲突的文件 git add <file>,并且执行 git revert --continue 继续撤销流程。如果决定放弃撤销提交,可以执行 git revert --abort,这将撤销 git revert 命令的执行,并返回到之前的状态。

三. git reset 和 git revert 的对比

在这里插入图片描述
假设我们提交了三次修改(修改一、修改二、修改三),现在发现修改二有 bug 需要回退,有两种方案。

方法一:git reset

由于 git reset 的原理是将 HEAD 指针指向之前的某次提交,想要将版本回退到修改一,需要使用 git reset commit-id1。reset 之后,通过 git log 可以看到,目标版本之后的提交全都没有了。
在这里插入图片描述
适用场景:如果想恢复到之前的某次提交的版本,且那个版本之后的提交都不要了,可以使用 git reset 命令。

方法二:git revert

由于 git revert 的原理是创建指定版本的反向操作,所以可以使用 git revert commit-id2 创建一个新的修改四。修改四撤销了修改二的操作,并将 HEAD 指针移动到了修改四。这个命令不会丢失任何更改,是一个安全的操作。

在这里插入图片描述
适用场景:如果想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用 git revert 命令。

相关推荐

  1. @RequestBody@RequestParam@PathVariable@RequestAttribute

    2024-01-26 07:34:04       29 阅读
  2. ==equals

    2024-01-26 07:34:04       36 阅读
  3. 关于%/

    2024-01-26 07:34:04       20 阅读
  4. nodejsnpmvite

    2024-01-26 07:34:04       30 阅读
  5. computedwatchwatchEffect 相同不同

    2024-01-26 07:34:04       36 阅读
  6. 分布式集群区别优势

    2024-01-26 07:34:04       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-26 07:34:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-26 07:34:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-26 07:34:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-26 07:34:04       18 阅读

热门阅读

  1. com.sun.jna.platform.mac.SystemB$Timeval

    2024-01-26 07:34:04       30 阅读
  2. linux 内核MAC 地址解析

    2024-01-26 07:34:04       32 阅读
  3. nrm-npm包版本管理和详细安装和使用教程

    2024-01-26 07:34:04       35 阅读
  4. 使用uniApp+vue3+Vite4+pinia+sass技术栈构建微信小程序

    2024-01-26 07:34:04       34 阅读
  5. SpringBoot ResponseBodyAdvice使用以及常见问题

    2024-01-26 07:34:04       33 阅读
  6. 前端学习之——react篇(条件渲染)

    2024-01-26 07:34:04       44 阅读
  7. Dockerr开发环境搭建

    2024-01-26 07:34:04       36 阅读
  8. 阿里云centos安装mysql,并修改初始密码

    2024-01-26 07:34:04       42 阅读
  9. SQL中的DML、DDL以及DCL是什么?

    2024-01-26 07:34:04       37 阅读
  10. 常用的gpt-4 prompt words收集7

    2024-01-26 07:34:04       33 阅读