在Git中恢复已经删除的Stash
今天工作的时候,需要从remote repository中获取别人提交的代码,但是自己的working tree已经修改的很多的东西,所以自然而然,先做一次stash再说。
不过在做stash的时候,正好在外部的编辑器中打开了一个工程中得资源文件,导致无法Git无法成功从working copy中删除这个文件。最终的结果是,stash做成功了,但是working copy依然是脏的。这个时候我做了莫名其妙的动作,直接删除了stash。删除完了才发现,stash没有了,但是working copy中只剩下那个孤零零的没有成功stash的文件。
一头冷汗哈,最近两天的工作啊。赶紧想办法把他找回来。还好还好,还是有办法的找回来的。
首先使用fsck命令找到dangling的对象。
git fsck
执行这个命令后,可以看到一大堆信息,就像下边的:
Checking object directories: 100% (256/256), done.
Checking objects: 100% (5572/5572), done.
dangling blob 6537cf0662e078710033e56b93a9b8aa6df60982
dangling commit 03d787944abf794d987a8793e6fce6bc92eaa54d
dangling commit f1e8f5c16aece59b9fe442f9f872aed9b5f2559c
dangling blob 69ec813d3669eb6a5441af1b0be17715e3230a91
dangling blob 16752b498905a04d1d702159c3c331381e1d98e9
这时候,找到你要恢复的对象,你可以用git show 来查看哪个是你删掉的。一旦找到了就好办了,有两个办法可以恢复:
一个是在.git/logs/refs/stash文件中加一条记录如下:
ID of previous stash commit in list or 0000000000000000000000000000000000000000 if none> Your Name
完成以后,你就可以在stash列表中看到你的被删除的stash对象。
另外一个方法就是执行git stash apply命令直接恢复到working copy中,这个时候,最好保证你的working copy是干净的。命令如下:
git stash apply ID(the ID of stash commit)
执行完毕,一切又都回来了!