Git 常用工作流与致命后悔药(Reset、Revert 与 Stash 速查)
在日常团队开发或者个人折腾项目时,Git 几乎是不可或缺的工具。然而,手滑提交了敏感配置、误操作合并了错误分支、或者正在改代码突然需要切分支修紧急 Bug,是每个开发者都会踩的坑。本文梳理了几条高频救命操作。
一、突发事件:代码写到一半需要切分支
当前工作区有大量未完成的代码,直接 git checkout 会报错或者把未提交修改带过去。此时首选暂存技术:
# 1. 给本次暂存加上描述,存入堆栈
git stash save "正在重构路由组件,待继续"
# 2. 此时工作区干干净净,可以放心切分支修 Bug
git checkout main
git checkout -b hotfix/login-bug
# 3. 紧急修复完成并提交后,切回原分支
git checkout feature/router-refactor
# 4. 查看当前暂存列表
git stash list
# 5. 弹出并恢复最近一次的暂存内容
git stash pop
二、手滑后悔药:撤销不同阶段的操作
撤销修改的核心在于搞清楚当前修改停留在哪个阶段(工作区、暂存区、本地提交、远程推送)。
1. 仅在工作区修改,尚未 git add
# 放弃单个文件的修改
git restore src/index.js
# 放弃当前目录下所有未暂存的修改
git restore .
2. 已经执行了 git add,尚未 git commit
# 将文件移出暂存区,保留本地代码
git restore --staged src/config.json
3. 已经 git commit 到本地,但想撤回
# 保留代码改动,仅撤销 commit 记录(推荐方案)
git reset --soft HEAD~1
# 彻底丢弃上次 commit 及所有代码(慎用)
git reset --hard HEAD~1
⚠️ 生产环境重要警示
如果代码已经执行了 git push 推送到公共协作分支,严禁使用 reset --hard 并强推。此时必须使用 git revert <commit_id>,它会生成一条新的逆向提交,不破坏他人的提交历史。
三、分支清理与垃圾回收
长期迭代后,本地往往残留大量已经合并并删除的远程废弃分支:
# 同步远程分支状态,清理本地已失效的分支追踪记录
git fetch --prune
# 查看所有已合并到主分支的本地分支
git branch --merged main
小结
Git 的本质是基于快照的有向无环图(DAG),只要没有手动执行彻底的 git gc 清理,绝大多数误操作都能通过 git reflog 找回对应的 commit SHA 并重置回来。保持冷静,善用日志。