git reset --hard 操作后的数据恢复
在进行正文之前先简单介绍下git reset
命令
git reset
git reset
命令用于改变当前的仓库状态,简单的场景用例:假设一次修改了两个文件,然而需要对这两个文件分别进行两次提交,在进行缓存操作时(git add
),不小心将两个文件都进行了缓存,此时我们需要对其中一个文件取消缓存,此时就需要git reset
操作来实现,如下图
然后,对b.txt
进行commit
操作,然后再对a.txt
进行add & commit
操作
对于git reset
命令添加了--hard 参数后会怎样呢,在git官网的reference上 有如下一段话
也就是说,添加--hard
参数后,会回到上次commit
的状态,也就是说从上次commit
之后的的修改都将被重置,换句话说这些数据都丢失了,所以要谨慎操作哦。
前置知识就到这里了,开始今天的重点。
当我们进行了git reset --hard
操作进行了版本回退,现在我们又需要之前的修改信息,也就是说我们需要版本回退之前的文件信息,此时我分了三种情况
- 之前的修改进行了
commit
提交,也就是说我们回退前的修改(曾经)存在于版本里; - 之前的修改未进行
commit
提交,但是进行了git add
操作; - 之前的修改未进行
commit
提交,也未进行git add
操作。
如果时第一种情况,很简单我们拿到之前修改的commit
的哈希值(或者说id),然后执行 git reset --hard [hash]
就可以回退到之前修改的状态。
怎么拿hash
, 这个好说,可以执行命令git reflog
命令,它会显示出你之前的所有操作
像这个
62f039e
就是我的reflog
提交的哈希值,对其进行reset
即可
如果是第三种情况,不好意思暂时还没有找回的办法,如果你有欢迎拿出来大家交流
今天的重点就是第二种情况,毕竟曾经我也以为此情况无解,直到后来这边文章诞生前。
今天的主角命令 git fsck
,这里呢不具体讲解此命令,只是简单描述利用此命令进行文件恢复。
如图示,我新建了文件c.txt
并添加了内容 'git fsck',添加到缓存之后进行了reset
操作, 此时因为没有进行git commit
操作所以没有hash值,可供恢复,这个时候需要进行操作 git fsck --lost-found
操作,返回如下结果:
关于此命令,git官网的解释
[图片上传失败...(image-deb41a-1562049785342)]
根据提示,找到目录'.git/lost-found',可以看到,
我们在‘commit’和‘other’目录下分别看到命令窗口打印出的文件,在‘other‘目录下找出之前遗失的文件
然后新建'c.txt'文件,并将文件内容复制过去,结束。
是不是很麻烦,特别是一次提交的文件多了,一个一个新建(修改)复制过去好烦哦。
是的很烦,所以保持良好的习惯。永远不要让这种操作降临到自己身上才是正道。(这只是为不可控的意外情况准备的)
git reset --hard 操作后的数据恢复的更多相关文章
- git reset --hard HEAD^后显示more?的原因及如何解决
在windows的cmd控制台下操作git,想要回滚到上一次提交,但是输入git reset --hard HEAD^后就显示more? fatal: ambiguous argument 'HEAD ...
- MySQL中truncate误操作后的数据恢复案例
MySQL中truncate误操作后的数据恢复案例 这篇文章主要介绍了MySQL中truncate误操作后的数据恢复案例,主要是要从日志中定位到truncate操作的地方然后备份之前丢失的数据,需要的 ...
- git 找回 git reset --hard HEAD 后的代码
下面方法只针对当你本地代码做了 git add 或则 git commit 后又手贱的重置本地代码到上一个版本,导致本地代码丢失的情况. 如果你没有 git add 命令,而直接 git reset ...
- Oracle update 执行更新操作后的数据恢复
操作数据库,经常会出现误操作,昨天执行的更新操作之后发现更新错了,只能想办法数据恢复了,现在整理一下 第一步:查询执行更新操作的时间 select r.FIRST_LOAD_TIME,r.* from ...
- git 学习笔记 —— 切换和恢复提交版本( git reset/reflog/tag 命令)
记录一下关于 git 不同提交版本间切换的操作以及如何恢复至切换之前的版本. 切换到之前提交的版本 —— git reset --hard 笔者在使用 git 时,首先接触到了一个"黑魔法& ...
- Git 常用场景操作
git init 在本地新建一个repo,进入一个项目目录,执行git init,会初始化一个repo,并在当前文件夹下创建一个.git文件夹. git clone 获取一个u ...
- git reset总结
git reset git 的重置操作 有三种模式:hard.mixed(默认).soft 1. hard 用法 hard会重置stage区和工作区,和移动代码库上HEAD 和branch的指针所指向 ...
- 撤销git reset soft head操作
一不小心在eclipse的git库中执行了Reset Soft(HEAD ONLY)操作,不料界面中竟然没有找到撤销方法(于是心中五味俱全,经过一番折腾,无果还是回归Git本身),最终通过命令行,很快 ...
- git reset 版本回退操作
1 git回退命令 git reset --hard GIT_HEAD GIT_HEAD是你具体要回退的分支: 如图: 注: 查询GIT_HEAD可以通过两个命令:git log 获取未删除 ...
随机推荐
- [.net core]11.异常页
.net core中的异常页很重要 因为可以查看异常的堆栈信息, 请求的参数(如果有),cookie, http头 帮助我们快速的定位问题 .net core web app 默认开启了异常页,但是 ...
- Jpa/Hibernate 字节码增强:字段延迟加载
JPA提供了@Basic注解,实现延迟加载字段的功能,如下: @Basic(fetch = FetchType.LAZY) @Column(name = "REMARK_CONTENT&qu ...
- Java学习笔记-----eclipse中建立Java项目并成功运行
环境:WIN7 64位 +eclipse 2018 12version 具体方法:https://jingyan.baidu.com/album/9c69d48fefa53113c9024eb3.ht ...
- Redis入门部署及持久化
软件简介 软件说明 Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品. Redis采用内存(In-Memory)数据集(DataSe ...
- linux命令详解——ln
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln -s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...
- Delphi 保留字
- 测试 windows 发布日志
<script>alert("hellow world")</script>
- lnmp 环境搭建后,pathinfo 模式支持的配制。
ThinkPHP的四种URL模式:0(普通模式);1(PATHINFO模式);2(REWRITE模式);3(兼容模式) nginx需要PATHINFO模式,但需要更改nginx配置文件让其支持PATH ...
- js 判断确切判断Array和Object
js的数组其实是特殊的对象. 这就导致: typeof [1,2,3] === 'object' [1,2,3] instanceof Object 和 [1,2,3] instanceof Arr ...
- 为什么 Android 开发者都应该尝试一下 Anko?
简评: 这里介绍的仅仅是 Anko 中很小的一部分,Kotlin + Anko 真的让 Android 开发简化了不少,用了 Anko 基本就可以告别那些什么 Android 不得不知的代码收集贴了. ...