在进行正文以前先简单介绍下git reset
命令git
git reset
命令用于改变当前的仓库状态,简单的场景用例:假设一次修改了两个文件,然而须要对这两个文件分别进行两次提交,在进行缓存操做时(git add
),不当心将两个文件都进行了缓存,此时咱们须要对其中一个文件取消缓存,此时就须要git reset
操做来实现,以下图 缓存
b.txt
进行
commit
操做,而后再对
a.txt
进行
add & commit
操做
对于git reset
命令添加了**--hard** 参数后会怎样呢,在git官网的reference上 有以下一段话3d
也就是说,添加--hard
参数后,会回到上次commit
的状态,也就是说从上次commit
以后的的修改都将被重置,换句话说这些数据都丢失了,因此要谨慎操做哦。code
前置知识就到这里了,开始今天的重点。cdn
当咱们进行了git reset --hard
操做进行了版本回退,如今咱们又须要以前的修改信息,也就是说咱们须要版本回退以前的文件信息,此时我分了三种状况blog
commit
提交,也就是说咱们回退前的修改(曾经)存在于版本里;commit
提交,可是进行了 git add
操做;commit
提交,也未进行git add
操做。若是时第一种状况,很简单咱们拿到以前修改的commit
的哈希值(或者说id),而后执行 git reset --hard [hash]
就能够回退到以前修改的状态。 怎么拿hash
, 这个好说,能够执行命令git reflog
命令,它会显示出你以前的全部操做 像这个get
62f039e
就是个人reflog
提交的哈希值,对其进行reset
便可hash
若是是第三种状况,很差意思暂时尚未找回的办法,若是你有欢迎拿出来你们交流it
今天的重点就是第二种状况,毕竟曾经我也觉得此状况无解,直到后来这边文章诞生前。io
今天的主角命令 git fsck
,这里呢不具体讲解此命令,只是简单描述利用此命令进行文件恢复。
如图示,我新建了文件c.txt
并添加了内容 'git fsck',添加到缓存以后进行了reset
操做, 此时由于没有进行git commit
操做因此没有hash值,可供恢复,这个时候须要进行操做 git fsck --lost-found
操做,返回以下结果:
关于此命令,git官网的解释
咱们在‘commit’和‘other’目录下分别看到命令窗口打印出的文件,在‘other‘目录下找出以前遗失的文件
是否是很麻烦,特别是一次提交的文件多了,一个一个新建(修改)复制过去好烦哦。
是的很烦,因此保持良好的习惯。永远不要让这种操做降临到本身身上才是正道。(这只是为不可控的意外状况准备的)