git reset --hard 操做后的数据恢复

在进行正文以前先简单介绍下git reset 命令git

git reset

git reset 命令用于改变当前的仓库状态,简单的场景用例:假设一次修改了两个文件,然而须要对这两个文件分别进行两次提交,在进行缓存操做时(git add),不当心将两个文件都进行了缓存,此时咱们须要对其中一个文件取消缓存,此时就须要git reset 操做来实现,以下图 缓存

image
而后,对 b.txt进行 commit操做,而后再对 a.txt进行 add & commit操做

对于git reset命令添加了**--hard** 参数后会怎样呢,在git官网的reference上 有以下一段话3d

也就是说,添加--hard参数后,会回到上次commit的状态,也就是说从上次commit以后的的修改都将被重置,换句话说这些数据都丢失了,因此要谨慎操做哦。code

image

前置知识就到这里了,开始今天的重点。cdn

当咱们进行了git reset --hard操做进行了版本回退,如今咱们又须要以前的修改信息,也就是说咱们须要版本回退以前的文件信息,此时我分了三种状况blog

  1. 以前的修改进行了 commit 提交,也就是说咱们回退前的修改(曾经)存在于版本里;
  2. 以前的修改未进行commit提交,可是进行了 git add 操做;
  3. 以前的修改未进行 commit 提交,也未进行git add操做。

若是时第一种状况,很简单咱们拿到以前修改的commit的哈希值(或者说id),而后执行 git reset --hard [hash]就能够回退到以前修改的状态。 怎么拿hash, 这个好说,能够执行命令git reflog命令,它会显示出你以前的全部操做 像这个get

image

62f039e 就是个人reflog提交的哈希值,对其进行reset便可hash

若是是第三种状况,很差意思暂时尚未找回的办法,若是你有欢迎拿出来你们交流it

今天的重点就是第二种状况,毕竟曾经我也觉得此状况无解,直到后来这边文章诞生前。io

今天的主角命令 git fsck,这里呢不具体讲解此命令,只是简单描述利用此命令进行文件恢复。

image

image

如图示,我新建了文件c.txt并添加了内容 'git fsck',添加到缓存以后进行了reset操做, 此时由于没有进行git commit操做因此没有hash值,可供恢复,这个时候须要进行操做 git fsck --lost-found操做,返回以下结果:

image

关于此命令,git官网的解释

image
根据提示,找到目录'.git/lost-found',能够看到,

image

咱们在‘commit’和‘other’目录下分别看到命令窗口打印出的文件,在‘other‘目录下找出以前遗失的文件

image
而后新建'c.txt'文件,并将文件内容复制过去,结束。

是否是很麻烦,特别是一次提交的文件多了,一个一个新建(修改)复制过去好烦哦。

是的很烦,因此保持良好的习惯。永远不要让这种操做降临到本身身上才是正道。(这只是为不可控的意外状况准备的)

相关文章
相关标签/搜索