【Git篇】commit失败后,展示: stash@{0}WIP on Feature_xx:

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 popapply 恢复

你现在执行 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-stagedhusky 在 commit 校验失败时,执行了自动 stash,留下了:

    kotlin 复制代码
    stash@{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

  1. 创建一个临时分支:

    css 复制代码
    git checkout -b temp-stash-recover
  2. 然后再尝试恢复 stash:

    kotlin 复制代码
    git stash apply stash@{0}

    如果成功了,你就能看到文件都回来了!

  3. 把恢复出来的代码保存,或者 cherry-pick 回你当前主线分支。


✔ 方法三(只想看): 直接查看 stash 内容

你可以不应用它,只是看看那里面到底都存了什么:

css 复制代码
git stash show -p stash@{0}

这样可以复制粘贴丢失的那一小段代码回来。


✅ 如果你不小心 drop 掉 stash 了也别慌

也可以试试:

css 复制代码
git fsck --lost-found

💡 最后小建议

如果用的是 lint-stagedhusky 自动处理 commit,建议加一个 hook 自动打印提示,或者在 lint-staged.config.js 里加:

vbnet 复制代码
restoreUnstaged: false

防止自动 stash。

相关推荐
混血哲谈4 分钟前
如何安装git?
git
尸僵打怪兽4 小时前
gitee基本使用
git·gitee·git使用
冰凌糕7 小时前
Git 远程仓库
git·版本控制
Ring__Rain7 小时前
visual studio 常用的快捷键(已经熟悉的就不记录了)
c++·git·visual studio
烂漫心空7 小时前
Git 基本使用
git
王鑫的博客8869 小时前
git reset详解
git
HinsCoder20 小时前
使用SSH解决在IDEA中Push出现403的问题
运维·笔记·git·ssh·github·intellij-idea
键盘不能没有CV键1 天前
【日志链路】⭐️SpringBoot 整合 TraceId 日志链路追踪!
java·git·intellij-idea
江城开朗的豌豆1 天前
手把手教你定制Vue3项目的Git提交规范:cz-customizable实战
前端·git·程序员
opentrending1 天前
Github 热点项目 Krillin AI一键横转竖+AI配音+AI精准字幕,短视频创作者必备神器,效率翻倍
人工智能·git·爬虫·github·邮箱