背景
最近每天从早8点忙到晚12点,整个人有点忙迷糊了。今天早晨想着把昨天的更改提交一下,变更大概2k行,包含新拆的组件、数据通信、请求处理等。因为代码库配置了husky的pre-commit,每次commit时,会执行lint-staged,这是针对暂存区的文件运行指定的任务,比如代码格式化或静态检查,执行后通常会有一些代码格式报错。
按照报错提示依次解决后,再次commit,依然是lint-staged报错,但还有些别的报错,由于我醒的确实早,人确实有点迷糊,我没注意到那些报错,只看到我的代码变更都没了,那一刻我心如死灰。
排查
不合理排查
这个时候我想了想,这些可能是我的幻觉,我把编辑器关了,重新打开可能就恢复了(不要觉得人为什么可以这么傻,因为没睡醒的时候就是很傻),所以我按照我的幻想关掉了Vscode,重新打开后依然没有我的变更。
合理排查
冷静一想,我的commit记录由于lint-staged的报错,没有成功生成,所以git reflog也不会有记录,嗯果然没有呢!这个时候我只能去.git里看看有没有什么发现。
// 这里主要是进入项目的.git里
cd ~/xxxx/.git
进入后展示这样的目录:
整体的目录意义整理如下👇:
| 目录/文件 | 核心作用 |
|---|---|
HEAD | 当前分支指针(如 ref: refs/heads/main) |
hooks/ | Git 自动化脚本(提交/推送等事件触发器) |
objects/ | 存储所有 Git 对象(blob/tree/commit) |
refs/heads/ | 本地分支的提交哈希记录 |
logs/ | 所有分支的操作历史(用于 git reflog) |
因为没有提交成功,所以heads里时肯定没有我的变更,其次logs和git reflog功能一致,同左边的理也不会有我的代码变更。这个时候我进入index里看了一下暂存区的文件快照,嗯,果然有我的新增文件呢!很好,排查到这里,我打开谷歌开始搜索git commit 代码失踪,感谢这篇文章的作者:git commit 提交出错,工作区代码被回退到最开始内容,拯救了数万万个打工人。
所以,因为我的lint-staged failed,git自动把我的变更执行stash。其实我一开始执行过git stash list,由于确实没发现有什么值得我stash pop的,所以我没有在这条线上继续排查。
总结
不要在早上没睡醒的时候提代码。