Git Stash丟失后的完整找回指南
場(chǎng)景:本地分支有未提交的 git stash,合并遠(yuǎn)程分支后 stash 從列表消失,代碼"不見了"。
事故還原
- 在本地分支
test-eslint-copy上做了大量修改(props 清理、字段刪除等) - 用
git stash暫存了這些改動(dòng) - 執(zhí)行
git merge origin/test合并遠(yuǎn)程分支 - 合并后發(fā)現(xiàn)
git stash list里沒有了自己的 stash,改動(dòng)"消失"
根本原因:git stash 的記錄存儲(chǔ)在 refs/stash 引用鏈上。某些 git 操作(如帶沖突的 merge、reset 等)會(huì)導(dǎo)致 stash 引用丟失,但 stash 的 commit 對(duì)象本身還在 git 對(duì)象庫(kù)里,只是變成了"懸空對(duì)象(dangling commit)",沒有任何引用指向它。
找回步驟
第一步:確認(rèn) stash list 里真的沒了
git stash list
如果你的 stash 不在里面,繼續(xù)下一步。
第二步:用 fsck 找出所有懸空的 commit
git fsck --unreachable 2>&1 | grep "unreachable commit"
這會(huì)列出所有"孤兒 commit",stash 就藏在里面。
第三步:過濾出屬于你分支的 stash
stash commit 的 message 格式固定為 WIP on <分支名>: <hash> <commit message>,用這個(gè)特征過濾:
git fsck --unreachable 2>&1 | grep "unreachable commit" | awk '{print $3}' | while read c; do
msg=$(git log -1 --format="%s %ci" $c 2>/dev/null)
if echo "$msg" | grep -q "WIP on <你的分支名>"; then
echo "$c | $msg"
fi
done
把 <你的分支名> 替換成實(shí)際分支名,比如 test-eslint-copy。
輸出示例:
469b4f36... | WIP on test-eslint-copy: 23996d8 fix: 再次處理eslint問題 2026-04-28 10:03:30 +0800 bcb74bf5... | WIP on test-eslint-copy: 14aa429 Merge branch 'test' 2026-04-28 09:54:12 +0800
第四步:確認(rèn)是不是你要的那個(gè)
根據(jù)時(shí)間戳判斷,然后看改動(dòng)內(nèi)容:
git show <commit-hash> --stat
第五步:恢復(fù)
先處理工作區(qū)的干擾文件(如果有),再 apply:
# 如果有自動(dòng)生成的文件擋路,先丟棄 git checkout -- src/dts/auto-imports.d.ts src/dts/components.d.ts # 恢復(fù) stash git stash apply <commit-hash>
關(guān)鍵原理
| 概念 | 說明 |
|---|---|
git stash | 本質(zhì)是創(chuàng)建了 2~3 個(gè)特殊 commit,用 refs/stash 引用鏈串起來(lái) |
| stash 丟失 | 只是引用鏈斷了,commit 對(duì)象本身還在對(duì)象庫(kù) |
| dangling commit | 沒有任何引用指向的 commit,git fsck 可以找到 |
git gc | 垃圾回收,會(huì)清理 dangling 對(duì)象。找回操作要在 gc 之前做! |
預(yù)防措施
合并前養(yǎng)成習(xí)慣:
# 合并前先把 stash 轉(zhuǎn)成真正的 commit git stash pop git add . git commit -m "wip: 臨時(shí)保存" # 合并完再 reset 回來(lái) git merge origin/xxx git reset HEAD~1 # 把臨時(shí) commit 變回工作區(qū)改動(dòng)
或者更簡(jiǎn)單,用 --autostash:
git merge --autostash origin/xxx
這樣 git 會(huì)在合并前自動(dòng) stash、合并后自動(dòng) pop,不會(huì)丟。
總結(jié)一句話
stash 丟了不要慌,git fsck --unreachable 找懸空 commit,按時(shí)間戳認(rèn)出來(lái),git stash apply <hash> 直接恢復(fù)。只要沒跑 git gc,數(shù)據(jù)就還在。
到此這篇關(guān)于Git Stash丟失后的完整找回指南的文章就介紹到這了,更多相關(guān)Git Stash丟失找回指南內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Leaflet的VideoOverlay視頻圖層疊加實(shí)戰(zhàn)教程
這篇文章主要介紹了基于Leaflet的VideoOverlay視頻圖層疊加實(shí)戰(zhàn),本文首先介紹了DistortableVideo組件的相關(guān)知識(shí),它的github倉(cāng)庫(kù)信息,相關(guān)源代碼的目錄說明,使用依賴信息,需要的朋友可以參考下2023-02-02
調(diào)試JavaScript/VBScript腳本程序(IE篇)
JavaScript/VB Script腳本程序一般有兩種執(zhí)行方式,一種是嵌入在宿主程序里面執(zhí)行,比如在IE瀏覽器里面執(zhí)行;另外一種,在資源管理器里面雙擊執(zhí)行(雖然還是通過另外一個(gè)程序解釋執(zhí)行,但是給人的感覺畢竟是直接運(yùn)行)。2009-09-09
網(wǎng)站性能優(yōu)化之HTTP請(qǐng)求過程簡(jiǎn)述
網(wǎng)站性能優(yōu)化中首要的一條就是要減少HTTP請(qǐng)求,那么為要減少HTTP請(qǐng)求呢?其實(shí)有些HTTP分析工具可以幫我們了解當(dāng)瀏覽器請(qǐng)求一個(gè)資源時(shí)大致需要經(jīng)歷的哪些過程2011-12-12

