之前有关Git,写过一片文章: Git五个常见问题及解决方法

一、reset命令使用场景

有时候我们提交了一些错误的或者不完善的代码,需要回退到之前的某个稳定的版本,面对这种情况有两种解决方法:

解决方法1:修改错误内容,再次commit一次

解决方法2:使用git reset 命令撤销这一次错误的commit

第一种方法比较直接,但会多一次commit记录,同时并不是所有场景都可以这么做。

所以建议使用第二种方法,因为错误的commit没必要保留下来。

二、reset命令

git reset 命令用于回退版本,可以指定退回某一次提交的版本。

reset 命令的原理是根据 commitId 来恢复版本。

因为每次提交都会生成一个 commitId,所以说 reset 可以帮你恢复到历史的任何一个版本。

这里的版本和提交是一个意思,一个 commitId 就是一个版本

命令格式如下:

git reset [--soft | --mixed | --hard] [HEAD]

常用命令

# 回退所有内容到上一个版本
git reset HEAD^ # 回退test.txt这个文件的版本到上一个版本
git reset HEAD^ test.txt # 向前回退到第3个版本
git reset HEAD~3 # 回退到某个版本51363e6
git reset 51363e6

注意:对于已经 push 的 commit,也可以使用reset命令,不过再次 push 时,由于远程分支和本地分支有差异,需要强制推送 git push -f 来覆盖被 reset 的 commit。

这里非常需要注意,因为 git push -f 是一个非常危险的命令。

如果在 git push -f 之前有其他同事 push 新代码。那么同事提交代码会丢失。

所以这里一定要注意 git push -f 之前要先 git pull 拉下是否有新提交代码。

三、reset参数有哪些?

option 参数的选项有以下几种

git reset --mixed:此为默认方式,将撤回的代码,存放到工作区。同时会保留本地未提交的内容。

git reset --soft:回退到某个版本 。将撤回的代码,存放到暂存区。同时会保留本地未提交的内容。

git reset --hard:彻底回退到某个版本,丢弃将撤回的代码,本地没有commit的修改会被全部擦掉。(慎用)

下面对这三种参数分别一一通过示例演示

四、reset --mixed

默认方式,将撤回的代码,存放到工作区。同时会保留本地未提交的内容。

在代码提交后,我发现这次提交也就是 commitId 为 7812249,提交错了,需要撤回。

同时这个时候呢,本地又新增修改了一些代码

执行命令

git reset d0eda46

注意 这里的commitId不是提交代码2的,而是提交代码1的,因为我们想的是回到是1这个版本,别搞错了

可以看出本地的代码和撤回的代码都在,且都在工作区

我们再来看下提交日志

git log --oneline

可以看到 提交代码2 的提交记录已经没有了。

五、reset --soft

soft和mixed差别并不大,无非就是一个回退到暂存区一个回退到工作区。

我们来演示下,把上面三个文件重新提交一次

$ git commit -a -m  '提交代码2'
[feature ebb89a1] 提交代码2
3 files changed, 5 insertions(+), 2 deletions(-)

然后再来执行reset命令

git reset --soft d0eda46

可以看出撤回的都返回在暂存区。

六、reset --hardt

这个命令和前面差别就非常大了,它不仅会丢弃错误commit提交的代码,而且本地没有commit的修改会被全部擦掉,关键是这种情况本地代码一旦擦掉是没有任何办法在找回来了。

同样我们把上面的代码再次提交

$ git commit -m  '提交代码3'
[feature de970f2] 提交代码3
3 files changed, 5 insertions(+), 2 deletions(-)

然后再来执行reset命令

git reset --hard d0eda46

在看本地

$ git status
On branch feature
nothing to commit, working tree clean

在工作区和暂存区已经没有任何代码了,也就是如果这个时候你本地开发的代码没有提交,那就永远也找不回来了。

那之前提交过的但又撤回的 提交代码3 的代码可以找回吗?

这个是可以的。

我们通过 git log --oneline 是找不回的。

找不到 提交代码3 的记录了。 那怎么办呢?

可以通过 git reflog 命令实现找回

执行命令

git reflog

这里能找到 commit 提交代码3 的记录。那现在要做的就是撤回到当前提交的位置。

执行命令

git reset de970f2

全部回来啦。

注意 切记!!!工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了。

声明: 公众号如需转载该篇文章,发表文章的头部一定要 告知是转至公众号: 后端元宇宙。同时也可以问本人要markdown原稿和原图片。其它情况一律禁止转载!

Git进阶命令-reset的更多相关文章

  1. git进阶命令

    首先, clone 一个远端仓库,到其目录下: $ Git clone git://example.com/myproject $ cd myproject 然后,看看你本地有什么分支: $ git ...

  2. 超级有用的git reset --hard和git revert命令

    很多时候,git新手容易误操作,比如,在levelIISZ-1.4.dev分支下,运行了git pull idc cpp-1.0的结果,这样做麻烦很大,经常导致maven项目格式不正确,这个时候,可以 ...

  3. Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )

    在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题.以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分: 如何修改 ori ...

  4. git reset --hard和git revert命令

      git reset --hard和git revert命令   git误操作时可以用git reset –hard 去撤销这次修改, 但是这样做也有问题,可能在之前本地有没有提交的修改也都消失了, ...

  5. git 常用命令 mv rm checkout revert reset

    关于上节讲的git add 时需要添加注释信息,也可以在git commit时再添加 laoni@DESKTOP-TPPLHIB MINGW64 /c/laoni/PycharmProjects/gi ...

  6. Git进阶:常用命令和问题案例整理

    一.前言 整理常用git命令和以及在实际使用的过程中碰到的问题案例,旨在git进阶,提升工作开发效率,有需要补充的小伙伴欢迎下方留言,本篇持续更新中... 二.命令 配置用户名和邮箱 git conf ...

  7. Git 常用命令

    一.初始環境配置 git config --global user.name "John Doe"git config --global user.email johndoe@ex ...

  8. Git 进阶指南

    转自: https://github.com/kaiye/kaiye.github.com/issues/7 在掌握了基础的 Git 使用 之后,可能会遇到一些问题.以下是猫哥筛选总结的部分常见问题, ...

  9. git checkout 命令详解

    转自:http://www.cnblogs.com/hutaoer/archive/2013/05/07/git_checkout.html?utm_source=tuicool&utm_me ...

  10. git checkout 命令详解(转)

    在日常的git操作中,git checkout——检出,是我们的常用命令.最为常用的两种情形是创建分支和切换分支. 在下面的命令中,使用了一些简写,在这里说明一下: git st # git stat ...

随机推荐

  1. 内存池是什么原理?|内存池简易模拟实现|为学习高并发内存池tcmalloc做准备

    前言 那么这里博主先安利一些干货满满的专栏了! 这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助! 操作系统Operating Syshttps://blog.csdn.ne ...

  2. 基于OpenCV-Python的图像位置校正和版面分析

    前言 使用opencv对图像进行操作,要求:(1)定位银行票据的四条边,然后旋正.(2)根据版面分析,分割出小写金额区域. 图像校正 首先是对图像的校正 读取图片 对图片二值化 进行边缘检测 对边缘的 ...

  3. elasticsearch源码debug

    一.下载源代码 直接用idea下载代码https://github.com/elastic/elasticsearch.git 切换到特定版本的分支:比如7.17,之后idea会自己加上Run/Deb ...

  4. AutoGPT是什么?超简单安装使用教程

    1.AutoGPT 最近几天当红炸子鸡的是AutoGPT,不得不说AI发展真快啊,几天出来一个新东西,都跟不上时代的脚步了. AutoGPT是一个开源的应用程序,展示了GPT-4语言模型的能力.这个程 ...

  5. 关于Oracle RAC调整网卡MTU值的问题

    在Oracle RAC的环境中,如果我们发现OSW监控数据显示包重组失败率过高,就需要引起足够的重视,因为这很可能会引发member kill/Node kill等重大故障,甚至在有些场景会连带影响到 ...

  6. 23.1 SEH之终止处理--《Windows核心编程》结构化异常处理

    (structured exception handing)SEH 包含终止处理和异常处理.本章讨论终止处理. 一.终止处理 终止处理程序确保不管一个代码块(被保护代码)如何退出的,另一个代码块(终止 ...

  7. NC20568 [SCOI2012]滑雪与时间胶囊

    题目链接 题目 题目描述 a180285非常喜欢滑雪.他来到一座雪山,这里分布着M条供滑行的轨道和N个轨道之间的交点(同时也是景点),而且每个景点都有一编号i(1 ≤ i ≤ N)和一高度Hi.a18 ...

  8. java 注解结合 spring aop 实现自动输出日志

    auto-log auto-log 是一款为 java 设计的自动日志监控框架. 创作目的 经常会写一些工具,有时候手动加一些日志很麻烦,引入 spring 又过于大材小用. 所以希望从从简到繁实现一 ...

  9. spring boot携手echarts实现双柱状图实战

    说明 最近做了个图书管理系统,里面有个模块是统计最近一周借书和还书的情况. 设计为柱状图模式展现,自然需要用到echarts. 实现效果 开发步骤 1.页面和JS <!DOCTYPE html& ...

  10. Direct2D 另一种与D3D创建类似的方法

    在进行D2D学习的时候,发现了这样一篇文档, Direct2D Quickstart for Windows 8 只有这么一小段介绍, Direct2D is a native-code, immed ...