git 查询被误删的stash,会在终端列出被删的文件的内容概览,可以通过搜索获取对应的hash
#!/bin/bash
# ================================================================
# show_all_stash.sh
# 自动列出所有 stash(含删除的、悬空的),并显示内容摘要
# ================================================================
echo "🔍 查找所有 stash(包括已删除的)..."
echo
# --- 正常 stash 列表 ---
if git stash list | grep -q .; then
echo "🟢 当前有效 stash:"
git stash list --date=iso
echo
while IFS= read -r line; do
stash_ref=$(echo "$line" | awk -F: '{print $1}')
echo "----------------------------------------------------"
echo "📦 $stash_ref"
git show --stat "$stash_ref" | head -n 15
echo
done < <(git stash list)
else
echo "⚪ 当前没有有效 stash。"
echo
fi
# --- reflog 中的 stash 记录(可能已删除) ---
echo "🕓 搜索 reflog 中已删除的 stash 记录..."
if git reflog --grep-reflog=stash | grep -q .; then
git reflog --grep-reflog=stash | while read -r line; do
echo "----------------------------------------------------"
echo "🧩 Reflog: $line"
done
else
echo "⚪ 没有找到已删除的 stash 记录。"
fi
echo
# --- 查找悬空提交(可能是被删除的 stash)---
echo "🕳️ 搜索 Git 对象库中悬空的提交(dangling commits)..."
dangling_commits=$(git fsck --lost-found 2>/dev/null | grep "dangling commit" | awk '{print $3}')
if [ -n "$dangling_commits" ]; then
for hash in $dangling_commits; do
echo "----------------------------------------------------"
echo "🔸 悬空提交: $hash"
msg=$(git show -s --format='%s' "$hash")
echo "📝 提交信息: $msg"
git show --stat "$hash" | head -n 15
echo
done
else
echo "⚪ 没有发现悬空提交。"
fi
echo "✅ 检查完成。"
恢复所有被误删的文件,通过上面的hash找到对应的文件夹可以获取被删的内容
#!/bin/bash
# ================================================================
# recover_lost_git_objects.sh
# 自动扫描 Git 仓库中仍能恢复的悬空提交、stash 等对象
# 并将它们的文件内容导出到 ./recovered_commits 目录
# ================================================================
set -e
OUTPUT_DIR="./recovered_commits"
mkdir -p "$OUTPUT_DIR"
echo "🔍 扫描 Git 仓库中可恢复的提交对象..."
echo
# 1️⃣ 从 lost-found 获取对象
echo "🧭 检查 .git/lost-found ..."
LOST_FOUND_COMMITS=$(find .git/lost-found -type f 2>/dev/null || true)
if [ -n "$LOST_FOUND_COMMITS" ]; then
for file in $LOST_FOUND_COMMITS; do
HASH=$(basename "$file")
echo "📦 发现 lost-found 提交: $HASH"
RECOVER_DIR="$OUTPUT_DIR/$HASH"
mkdir -p "$RECOVER_DIR"
git show "$HASH" > "$RECOVER_DIR/commit.patch" 2>/dev/null || true
git archive "$HASH" | tar -x -C "$RECOVER_DIR" 2>/dev/null || true
done
else
echo "⚪ 没有发现 .git/lost-found 内容。"
fi
echo
# 2️⃣ 从 fsck 输出中检测悬空提交
echo "🧩 检查 git fsck 中的悬空提交..."
DANGLING_COMMITS=$(git fsck --no-reflogs 2>/dev/null | grep 'dangling commit' | awk '{print $3}' || true)
if [ -n "$DANGLING_COMMITS" ]; then
for HASH in $DANGLING_COMMITS; do
echo "📦 发现悬空提交: $HASH"
RECOVER_DIR="$OUTPUT_DIR/$HASH"
mkdir -p "$RECOVER_DIR"
if git cat-file -e "$HASH" 2>/dev/null; then
git show "$HASH" > "$RECOVER_DIR/commit.patch"
git archive "$HASH" | tar -x -C "$RECOVER_DIR" 2>/dev/null || true
else
echo "⚠️ 无法访问对象 $HASH,可能已被回收。"
fi
done
else
echo "⚪ 未发现悬空提交。"
fi
echo
echo "✅ 扫描完成。"
echo "所有恢复的内容已导出至:$OUTPUT_DIR"