git 误删分支后恢复方法
由于本人在开发的时候删除了分支,花费了一天的时间才将代码恢复,故此整理了如果误删git代码后的恢复方法
方法 1:通过本地 reflog 恢复(推荐)
查找分支删除记录
git reflog | grep -i 'delete.*branch'
输出示例:
7a1b2c3 HEAD@{2}: pull origin main: Fast-forward
9d8e7f6 HEAD@{3}: checkout: moving from feature/login to main
123456a HEAD@{4}: commit: Update login logic
e5f43d0 HEAD@{5}: branch: Delete branch feature/payment # ← 删除记录
找到删除前的提交ID(e5f43d0)
git branch <分支名> <提交ID> # 创建新分支指向旧位置
git branch feature/payment e5f43d0
验证恢复
git checkout feature/payment
git log --oneline -3 # 检查历史记录
方法 2:恢复远程分支(如果曾经推送过)
查看远程引用
git ls-remote origin
如果发现删除的分支引用(可能存在于其他成员的本地)
找回最后的提交ID(假设为 a1b2c3d)
本地重建分支
git branch feature/payment a1b2c3d
推送到远程
git push origin feature/payment
方法 3:使用 fsck 找回悬空提交(reflog 失效时)
查找孤立(悬空)提交
git fsck --full --no-reflogs --unreachable --lost-found | grep commit
检查可疑提交(会显示在 .git/lost-found 目录)
cd .git/lost-found/commit
cat * | less # 查看提交内容
找到正确提交后重建分支
git branch recovered-feature <提交ID>
? 找回已删除的未提交更改
恢复未暂存的修改
查找 .git 自动备份
find .git -name '*.gz' -exec ls -l {} \;
尝试解压最近的备份文件
gunzip .git/saved/path/*.gz
恢复已暂存但未提交的更改
查找所有引用日志
git reflog --all
检查索引状态
git fsck --cache --no-reflog --lost-found
✅ 恢复后的验证步骤
运行 git show <分支名> 确认内容完整
检查关键文件是否存在:git ls-tree -r <分支名> | grep 文件名
运行测试:npm test 或项目特定测试
比对历史记录:git log --graph --oneline --decorate --all
防止误删的防护措施
配置禁止强制删除本地分支
git config --global alias.delete 'branch -d'
git config --global alias.delete-remote 'push origin --delete'
设置分支保护(GitLab/GitHub)
在仓库设置中启用 protected branches
禁止对 main 和 release* 分支直接推送
创建删除前检查脚本
echo '#!/bin/sh
echo "⚠️ Deleting branch $1 - Last commit: $(git log -1 --format=%s $1)"
read -p "Confirm deletion? (y/n) " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]
then
echo "Deletion cancelled"
exit 1
fi
' > .git/hooks/pre-delete
chmod +x .git/hooks/pre-delete
? 最佳实践:使用自动化备份
创建每日分支快照
0 2 * * * git for-each-ref --format='%(refname:short)' refs/heads | xargs -I{} git bundle create ~/git-backups/$(date +\%Y\%m\%d)-{}.bundle {}
? Git 删除恢复成功率统计
情况 恢复成功率 时间窗口
刚删除(有 reflog) 98% 30天内
有远程追踪分支 95% 无期限
未推送分支+reflog过期 60% 取决于GC设置
未提交的更改 <30% 极小
紧急提示:误删后立即停止操作!每次提交都会减少恢复成功率
通过上述方法,大多数误删都能有效恢复。关键操作流程:检查 reflog → 验证远程状态 → 尝试 fsck → 设置防护避免再次发生。