在VScode里写完代码后准备提交,由于可以直接按键直接提交到远程仓库,就没咋输入命令,以前是一个一个文件的add,然后按提交,这次我直接点了个stash all changes,如下图
,然后按√提交,结果说
nothing to commit, working directory clean,纳尼,什么鬼,我代码呢?全不见了!差点气得吐血,但是觉得自己按的那个键是没有错的,咩有删掉,stash的意思是将文件放到暂存区栈里去了,代码没有提交,工作区处于游离状态,对git stash命令理解不透彻,误以为代码不见了。
然后,恢复方法:
①输入命令:git fsck --lost-found
然后到项目文件夹git目录下的 /.git/lost-found/other里有你add过的文件
中可以看到很大串字符串的一些文件,我举例其中一个:
fbffb1fddab3f45c937e1fa7b9ba2b0b6a53b965
然后复制这些字符,在git 中输入:
git show fbffb1fddab3f45c937e1fa7b9ba2b0b6a53b965
可以查看是否是你以前stash保存的代码。
然后就可以使用:
git merge fbffb1fddab3f45c937e1fa7b9ba2b0b6a53b965
如果以上方法不适用,我由于发现代码不见之后按了一次ctrl+Z,文件只恢复了一个,用这种方法后 只看到了一个以前提交过的的文件,并非这次“失踪”的代码。
所以看下面的方法并且熟悉命令:
②直接输入git stash ,git stash list 和 git stash pop,
文件就找回来了。开心惨了!然后提交代码到远程仓库!
stash原理是:先把工作区恢复到上次提交的内容,同时备份本地的修改,之后就可以正常的pull代码了,pull完成后,再进行stash pop将之前的修改返回到当前工作区。
git stash:备份当前工作区的内容,从最近一次提交中读取相关内容,让工作区保证和上次提交的内容一致,同时,将当前工作区的工作内容保存在Git栈中;
git stash 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录
git stash pop:从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。如果存在多个stash的内容,所以用栈来管理,pop会从最近一个stash栈中读取内容并恢复。注:该命令将堆栈中最近保存的内容删除(栈是先进后出)
git stash list:显示Git栈中所有的备份,利用列表来决定从哪个地方恢复。
git stash clear:清空Git栈。
如果要放弃本地的修改:
git reset --hard
git pull origin 分支名
执行 git reset --hard commid_id (坏灭性操作)这个命令是强制回退到某一次历史commit的版本,并清除本地修改!
find .git/objects -type f | xargs ls -lt | sed 60q:找回本地仓库里边最近add的60个文件,找回思路同上
总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
参考:https://www.jianshu.com/p/b2e5a6611183