git reset --hard は未コミットの変更を一瞬ですべて破壊します。確認も、ゴミ箱も、取り消しもありません。Claude Code は「まっさらからやり直すのが一番速い」と判断したときに、これを走らせます。
Claude が git reset --hard を走らせると:
Claude が併せて走らせる git clean -fd と組み合わさると、追跡されていないファイルまで削除されます。
失敗したやり方を Claude が「掃除」する
Claude が実装を試し、エラーにぶつかり、最初からやり直すと決める。「白紙に戻す」ために git reset --hard HEAD を走らせ——自分の作業もろとも、あなたの未コミットの作業を消す。
Claude がマージの衝突を力ずくで解決する
マージの衝突の最中に、Claude が衝突を解決する代わりに git reset --hard origin/main を走らせる。ローカルの変更が、リモートの状態で上書きされる。
午前3時の自律セッション
あなたが眠っている間に、Claude が問題にぶつかり git reset --hard && git clean -fd を走らせる。朝起きると、作業ディレクトリは最後のコミットと一致していて——それ以外はすべて消えている。
git checkout -- で手作業の編集30件以上が消えた
git checkout -- <files> と git restore . は、作業ツリーの変更を確認なしで黙って破棄します。取り消しもありません。#37888 では、この方法で手作業の編集30件以上が破壊されたと報告されています。
「git reset --hard を決して走らせるな」という CLAUDE.md のルールはお願いです。文脈が一杯になったり、Claude がそのリセットを「必要だ」と判断したりすると、ルールは無視されえますし、実際に無視されます。hook はプロセスの層で動きます——モデルはこれを迂回できません。
destructive-guard.sh は危険な git コマンドを止めます:
#!/bin/bash
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
# git reset --hard を止める
if echo "$COMMAND" | grep -qE 'git\s+reset\s+--hard'; then
echo "BLOCKED: git reset --hard destroys uncommitted work" >&2
exit 2
fi
# git clean -fd を止める
if echo "$COMMAND" | grep -qE 'git\s+clean\s+-[a-zA-Z]*f'; then
echo "BLOCKED: git clean -f deletes untracked files permanently" >&2
exit 2
fi
exit 0
この hook はすべての Bash コマンドの前に動きます。終了コード2が、コマンドの実行の前にそれを止めます。
| コマンド | 結果 |
|---|---|
git reset --hard | BLOCKED |
git reset --hard HEAD~3 | BLOCKED |
git clean -fd | BLOCKED |
git reset --soft HEAD~1 | ALLOWED |
git checkout -- file.js | ALLOWED(uncommitted-discard-guard で止められます) |
git checkout -- <files> と git restore . は、作業ツリーの変更を黙って破棄します——確認も、取り消しもありません。#37888 では、この方法で手作業の編集30件以上が破壊されたと報告されています。
npx cc-safe-setup --install-example uncommitted-discard-guard
git checkout --、git checkout .、git restore(--staged を除く)、git stash drop を止めます。
まだ望みはあります。コミット済みの変更を git reset --hard で消した場合は、git reflog に消えたコミットの記録が残っていることが多く、git reset --hard <reflog のハッシュ> で戻せます。ただし一度もコミットしていない変更(ステージ済み・未ステージともに)は reflog にも残らず、復元できません。だからこそ、実行の前に止めることが唯一の確実な防御です。
npx cc-safe-setup
git reset --hard と rm -rf を止め、main への force push を防ぎ、秘密の漏洩を捕まえます。9,200以上のテスト 734の hook
npx cc-safe-setup --verify
各 hook にテストの入力を送り、正しく止まることを確認します:
destructive-guard:
✔ git reset --hard → BLOCKED
✔ git reset --soft HEAD~1 → ALLOWED
8/8 hooks verified
npx cc-health-check
無料の20点の診断。80点を下回るなら、Claude Code の設定に隙間があります。
cc-safe-setup はオープンソースで、依存はなく、グローバルには何も入れません。すべての hook はローカルで動きます。GitHub でソースを見る。
さらに詳しく: 事故防止の実践ガイド(Zenn) · English version · 全ツール