git commit -m 提交时,代码报错,husky校验没通过, 应该也是没提交成功,但是本地错误的部分代码不见了,看当前分支记录, 发现提交记录展示: stash@{0}WIP on Feature_xx:
这个情况非常典型!核心在于:commit 提交失败了,但 Husky(或 Git 本身)自动帮你 git stash
了一次,导致代码"看似消失" 。
我们来详细解构两个问题👇
🧠 1. 为什么会出现 stash@{0} WIP on Feature_xx
?
这是 Git 的自动保护机制在发挥作用!
当你执行 git commit -m "xxx"
,但 Husky 的 pre-commit 钩子校验没通过(比如 eslint、lint-staged 报错)时 ,Git 没法提交代码,但又不想让你失去已 add
的内容,于是:
🔐 它会自动执行一个类似:
perl
git stash push -k -m "WIP on Feature_xx"
其中 -k
表示 保留工作区(未 add 的改动) ,只 stash 已 add
的内容。
✅ 所以你看到的 stash@{0}
就是 Git 为你保存的 暂存区的内容(index 区)
你的代码"丢失"了,其实是被 Git 暂存保护起来了 ------ 还没被删!能找回!
🛠️ 2. 如何找回这些代码?
🔍 查看你当前的 stash 内容:
git stash list
你会看到:
csharp
stash@{0}: WIP on Feature_xx: xxx...
✅ 查看这个 stash 里都保存了什么:
css
git stash show -p stash@{0}
这个会打印出差异(diff),你可以先预览。
🧑🔧 恢复丢失代码的方法(推荐两种方式):
✅ 方式一:恢复到当前分支工作区(最简单)
perl
git stash pop
这会把 stash@{0} 中的改动恢复出来,并将该 stash 条目删除。
⚠️ 注意:如果当前工作区有冲突,
stash pop
会提示你冲突并要求你解决。
✅ 方式二:先备份再应用(更稳妥)
perl
git stash apply stash@{0} # 应用但不删除 stash
# 确认无误后
git stash drop stash@{0} # 手动删除 stash
💡 小建议:以后遇到 Husky 拦截也不怕
✅ 提交前加一层保护:
perl
git status # 看看哪些是 staged 的
git stash push -m "手动备份" # 提交前手动 stash
或者使用:
sql
git commit -n -m "绕过 hook 的提交" # 如果是你明确知道问题,不想执行 pre-commit,可用 -n
🧭 总结一下:
问题 | 答案 |
---|---|
stash@{0} 是什么? |
Git 自动保护机制在 commit 失败时生成的暂存记录 |
为什么代码"消失"? | 已 add 的部分被临时 stash 了(不是被删除) |
如何找回? | git stash show -p 预览,git stash pop 或 apply 恢复 |
你现在执行 git stash pop
,应该就能直接看到代码回来了!👌
问题又来了,我中间merge过,当我按照上面步骤执行完之后, 执行: git stash apply stash@{0} 提示error, git stash list, 展示:stash@{0}: lint-staged automatic backup
你现在遇到的是一个 lint-staged
自动 stash 导致的代码被"隐藏",但 merge 之后再恢复 stash 出错 的场景,这种情况稍微复杂一些,但仍然可以处理!咱们一步步来:
🧭 你现在的状态总结:
-
✅ 你在当前分支(比如
test
)执行了git merge v2
-
⚠️ 合并前,
lint-staged
或husky
在 commit 校验失败时,执行了自动 stash,留下了:kotlinstash@{0}: lint-staged automatic backup
-
❌ 你在 merge 后尝试
git stash apply stash@{0}
报错了。
❓ 为什么 stash apply
会报错?
通常报错原因是:stash 里的代码与当前工作区存在冲突,Git 不知道怎么合并。
比如:
- 你 merge 后,当前代码已经变更或删除了 stash 对应的文件;
- stash 中和 merge 后的版本冲突太多,Git 无法自动应用;
- 或者 Git 误以为当前工作区"干净",但实际结构变了。
✅ 怎么找回你 stash@{0} 的代码?
✔ 方法一:把 stash 里的内容 导出到 patch 文件
这招最稳,可以把被 stash 的代码手动打包出来!
css
git stash show -p stash@{0} > stash_backup.patch
然后你可以用任何方式查看这个 stash_backup.patch
,甚至手动拷代码回来。
也可以再用 git apply
把它打回来:
git apply stash_backup.patch
如果这里再报错,也可以加 --reject
看冲突:
css
git apply --reject stash_backup.patch
✔ 方法二:切换到干净分支尝试恢复 stash
-
创建一个临时分支:
cssgit checkout -b temp-stash-recover
-
然后再尝试恢复 stash:
kotlingit stash apply stash@{0}
如果成功了,你就能看到文件都回来了!
-
把恢复出来的代码保存,或者 cherry-pick 回你当前主线分支。
✔ 方法三(只想看): 直接查看 stash 内容
你可以不应用它,只是看看那里面到底都存了什么:
css
git stash show -p stash@{0}
这样可以复制粘贴丢失的那一小段代码回来。
✅ 如果你不小心 drop 掉 stash 了也别慌
也可以试试:
css
git fsck --lost-found
💡 最后小建议
如果用的是 lint-staged
或 husky
自动处理 commit,建议加一个 hook 自动打印提示,或者在 lint-staged.config.js
里加:
vbnet
restoreUnstaged: false
防止自动 stash。