踩坑经历
在 feature-a 分支上开发,想要回退几个版本重新整理逻辑。于是执行了 git reset --mixed <commit-id>。此时,回退的代码变成了“未提交的修改”,躺在工作区里。
此时我需要去 feature-b 分支查个东西,于是我在 IDEA 中直接点击切换到了 feature-b。
等我切回 feature-a 时,发现以下现象:
-
那些原本 reset 出来的修改过的代码全没了。
-
但是奇怪的是,新创建的文件(Untracked)却还在。
造成以上代码丢失的原因如下:
Git 的工作区(Working Directory)是不属于任何分支的。当执行 git reset --mixed 后,代码回到了“已跟踪但未提交”(Uncommitted & Modified)的状态。当点击切换分支时,IDEA 检测到工作区有未提交的修改,默认强制切换,丢弃本地修改以匹配目标分支(相当于执行了 git restore 或 git checkout -f)。
如何找回代码?
方法一:IDEA 的 Local History
IDEA 自身维护了一套独立于 Git 的“物理文件历史”。
-
在项目根目录右键,选择 Local History -> Show History。
-
在左侧时间轴中,找到你 Checkout 或 Reset 之前的那个时间点。
-
甚至能看到 IDEA 帮你执行删除操作的记录。
-
右键点击那条记录,选择 Revert。
方法二:Git Reflog
如果你在 reset 之前,代码是已经 Commit 过的(只是想 reset 出来修改),那么 Git 仓库里其实还有备份。
-
执行 git reflog。
-
找到 reset 操作之前的那个 Commit Hash。
-
执行 git reset --hard <那个Hash>。
最佳实践
切分支前保持工作区干净。可以考虑使用 Stash
(如果你只是想去别的分支看一眼,稍后回来继续改)
# 1. 暂存现场
git stash save "重置后的临时代码"
# 2. 切换分支去忙别的
git checkout feature-b
# 3. 回来后恢复
git checkout feature-a
git stash pop
总结
弄丢代码通常是“覆盖”操作弄丢的。而 IDEA的自动化操作有时会让这个覆盖过程变得悄无声息。遇到 reset 后切分支,谨记:先 Stash,再 Checkout。
998

被折叠的 条评论
为什么被折叠?



