用 git reflog 可找回被 VSCode 删除但未 gc 的分支:先运行 git reflog 找分支删除前的提交哈希,再执行 git branch 分支名 哈希重建分支,最后用 git checkout 或 git switch 切换。

Git 分支被删但还没 gc:用 git reflog 找回提交哈希
VSCode 里点叉删掉的本地分支,其实只是删了引用,对应提交对象还在 Git 对象库里,只要没触发自动 git gc(通常要闲置数周),就能捞回来。git reflog 记录的是你本地 HEAD 的每次移动,包括 checkout、merge、reset,也包括分支删除前最后一次指向它的位置。
实操建议:
- 立刻在项目根目录终端运行
git reflog,找目标分支名最后一次出现的行,例如:abc1234 HEAD@{5}: checkout: moving from feature/login to main—— 这说明abc1234就是feature/login分支删掉前的最新提交 - 如果记不清分支名,用
git reflog --all | grep -i "branch.*delete"快速过滤删除动作(注意:VSCode 删除分支不会直接写 delete 日志,所以更可靠的是找 checkout 前的那条) - 别等几天再试,
git gc可能自动清理“不可达”对象,尤其你频繁做 rebase 或 filter-branch 后
用 git branch 重建分支并切换
拿到提交哈希后,重建分支就是一步命令,不需要先 checkout 再 branch —— 那样反而容易切错位置。
实操建议:
- 执行
git branch feature/login abc1234(把abc1234换成你从 reflog 里抄的哈希),分支就回来了 - 接着
git checkout feature/login或 VSCode 底部状态栏点分支名切换,确认当前分支已激活 - 如果想一步到位:用
git switch -c feature/login abc1234(Git 2.23+),比checkout更语义清晰,且不会误触发文件覆盖警告 - 注意:别用
git branch -f强制重设已有分支名,除非你确定要覆盖 —— 万一本地有同名但不同源的分支,会丢数据
VSCode 分支视图不刷新?手动触发或检查 Git 状态
有时候分支重建成功了,但 VSCode 左下角状态栏或源代码管理视图里还是看不到新分支,不是没建好,是 UI 缓存没更新。
实操建议:
- 按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(Mac),输入 “Git: Refresh” 并回车,强制重载分支列表 - 检查 VSCode 设置里
git.autoRepositoryDetection是否为true,否则它可能压根没把当前文件夹识别为 Git 仓库 - 如果用了多根工作区(multi-root workspace),确保你在正确的文件夹里操作 ——
git branch是按当前打开的文件夹执行的,不是整个窗口 - 极少数情况:VSCode 的 Git 扩展进程卡住,右键右下角 Git 图标 → “Restart Extension Host”
预防下次误删:关掉 VSCode 的“一键删除”开关
VSCode 默认允许在分支列表里右键直接删分支,没有二次确认,这是多数人手滑的根本原因。
实操建议:
- 打开设置(
Ctrl+,),搜索git.branchSortOrder,往下翻找到Git: Confirm Delete Branch,勾选它 —— 下次删分支就会弹确认框 - 或者直接在
settings.json里加一行:"git.confirmDeleteBranch": true - 更彻底的办法:把分支列表右键菜单里的 “Delete Branch” 项隐藏掉。安装扩展 “Customize UI” + “Advanced Customization”,但代价是维护成本上升,一般没必要
- 记住:远程分支(
origin/xxx)不会被这个操作删掉,但本地跟踪分支(origin/xxx对应的本地xxx)一旦删了,git pull时会报unable to resolve reference,得手动git fetch --prune
reflog 不是永远可靠的,它只保留 HEAD 历史,默认 90 天,而且每条记录只存 100 条左右 —— 如果你长期不碰那个分支,或者机器重装过 Git,就真没了。


















