場(chǎng)景:
使用Git stash命令或者SourceTree暫存了工作現(xiàn)場(chǎng),之后誤刪了這個(gè)stash
恢復(fù)方法:
第一步:git fsck --unreachable
使用git fsck --unreachable命令查找所有unreachable記錄
例如:
unreachable blob a006a061d217fa2bd0b677382dafbbc37fb7bb95
unreachable commit 7d15700a371681272d42518823e8a0dcb39ac112
unreachable blob a61518e80a488927908b96b30abb5dfb7036e9a3
unreachable commit 5719e0b26d788b51590dcfc4120a5a1af05da9ed
unreachable blob 321fc00f3bd3c882838435eb369aad327ddf6c51
unreachable blob 103ca03c95f52f97be07615defaadf6644c6445c
unreachable blob cb54781533e2c2b59938fc1eec774951f0fadb14
unreachable commit f362c87f5d191cf36dd9772c03e99e9b62d96e6e
unreachable commit 576b90e8bd69f825168f46a6141fa1516dc32a6a
unreachable blob 1d7ed8094eec81bd0152819b7e8ff3f7ba4a3a4b
第二步:git show +<sha>
使用git show +<sha>命令查找你需要恢復(fù)的那一條工作現(xiàn)場(chǎng),sha是上面的key?!敬藭r(shí)建議只關(guān)注commit類型的工作現(xiàn)場(chǎng)】
對(duì)于commit,將看到分支信息、stash時(shí)的備注信息、stash操作的時(shí)間點(diǎn)等。
對(duì)于blob,只能看到代碼塊,受限于窗口大小,往往顯示不完整。
使用回車或者向下箭頭,按一次多出一行代碼。使用q,退出查看工作現(xiàn)場(chǎng)。
也可以使用 git cat-file -p +<sha>可以查看工作現(xiàn)場(chǎng)。
如果是blob,會(huì)顯示完整代碼。
如果是commit,可能看到的會(huì)是多個(gè)對(duì)象,例如:
tree 9189ac84beec7e0063796f9640ad733cf6c143a1
parent 8e5d8eb7b94ab97b3e52b2835c2c0fa1cfd24f82
parent 60d315aa6a88b65761b9c499f356144c9e4c3a29
......
對(duì)象詳情請(qǐng)看備注部分。
第三步:git stash apply +<sha>
使用git stash apply +<sha>即可恢復(fù),sha就是你打算恢復(fù)的那一條記錄的key。但只可能恢復(fù)unreachable commit 開頭的記錄,unreachable blob是不能用git statsh apply+來恢復(fù)的,會(huì)報(bào)not a stash-like commit 錯(cuò)誤。
unreachable commit的開頭的也可能報(bào)錯(cuò):
<sha> is not a stash-like commit。
這時(shí)怎么處理呢?
1)切換到丟掉stash的那個(gè)分支。
2)git merge +<sha>即可。如有沖突,處理一下就好。
備注:
Git中有四種基本對(duì)象類型:
| 數(shù)據(jù)類型 | 含義 |
|---|---|
| blobs | 每個(gè)blob代表一個(gè)(版本的)文件,blob只包含文件的數(shù)據(jù),而忽略文件的其他元數(shù)據(jù),如名字、路徑、格式等。 |
| trees | 每個(gè)tree代表了一個(gè)目錄的信息,包含了此目錄下的blobs,子目錄(對(duì)應(yīng)于子trees),文件名、路徑等元數(shù)據(jù)。因此,對(duì)于有子目錄的目錄,git相當(dāng)于存儲(chǔ)了嵌套的trees。 |
| commits | 每個(gè)commit記錄了提交一個(gè)更新的所有元數(shù)據(jù),如指向的tree,父commit,作者、提交者、提交日期、提交日志等。每次提交都指向一個(gè)tree對(duì)象,記錄了當(dāng)次提交時(shí)的目錄信息。一個(gè)commit可以有多個(gè)(至少一個(gè))父commits。 |
| tags | tag用于給某個(gè)上述類型的對(duì)象指配一個(gè)便于開發(fā)者記憶的名字, 通常用于某次commit。 |