【Git実践】reflogとstashでやらかしを復旧する
`git reflog` と `git stash` を使ったやらかしの復旧方法を、実際のコマンドで確認していきましょう。「消えた!」と焦る前に、この2つを知っておくと安心感がまったく変わります。
—
git reflogで reset –hard 後のコミットを復旧する
`git log` はコミット履歴を表示しますが、`git reflog` は HEAD やブランチなどの参照がローカルでどう動いたかの記録を表示します。
git reflog
実行すると、こんな出力が得られます。
abc1234 HEAD@{0}: reset: moving to HEAD~1
def5678 HEAD@{1}: commit: ログイン機能を追加
ghi9012 HEAD@{2}: commit: 初期コミット
`git reset –hard HEAD~1` でコミットを消してしまったとき、多くの人は「もう戻せない」と諦めます。しかし reflogにはそのコミットのハッシュが残っています。未コミットの変更が残っている場合は、先に `git status –short` と `git diff` で内容を確認してから進めてください。
# reflog で消える前のコミットハッシュを確認
git reflog
# そのハッシュへ戻す
git reset --hard def5678
これだけで、消えたと思っていたコミットが戻ります。`reset` 直後で `reflog` を見て `ORIG_HEAD` が戻したい位置を指していると確認できた場合は、`git reset –hard ORIG_HEAD` でも同じように戻せます。
reflog の注意点
reflogはあくまでローカルの記録です。リモートリポジトリには同期されません。また、保持期間には注意が必要です。Git公式の設定では、通常のreflogエントリは90日、`reset –hard`などで到達不能になったコミットのエントリはデフォルト30日を目安に期限切れになります(`git gc`の実行状況によっても変わります)。「消した直後」であれば、ほぼ確実に復旧できますが、時間が経つほど不確実になると覚えておきましょう。
—
git stashで作業を一時退避・復旧する
途中まで書いたコードを消さずに、別のブランチへ移動したい。そんなときが `git stash` の出番です。
# 現在の変更を退避する(未追跡ファイルは含まれない)
git stash
# 退避した内容を一覧表示
git stash list
# 退避した内容を戻す(適用に成功すると一覧から削除される)
git stash pop
# 取り出すだけで削除しない
git stash apply
`git stash pop` は適用に成功した場合のみ一覧から削除されます。戻す先のファイルが変わっていて衝突が起きた場合は一覧に残るので、解決後にあらためて `git stash drop` するか判断してください。
よく使うオプション
| コマンド | 何をするか |
|---|---|
| `git stash push -m “メッセージ”` | 内容が分かるようにメモをつけて退避 |
| `git stash -u` | 追跡されていない新規ファイルも含めて退避(`.gitignore`対象まで含めたい場合は`-a`) |
| `git stash show` | 退避内容の変更ファイル・変更量の概要を確認 |
| `git stash drop stash@{0}` | 指定したstashを削除 |
| `git stash clear` | すべてのstashを削除 |
`stash drop` と `stash clear` は通常の手順では戻せない可能性が高い操作です。本当に不要になったものだけに使いましょう。
—
Claude Codeに復旧を頼むときのプロンプト
Claude Codeユーザーであれば、reflogやstashを使った復旧をそのまま相談できます。ただし `reset –hard` や `stash drop` は元に戻すのが難しい操作なので、実行前に必ず内容を確認する一文を添えるのがポイントです。
読者がそのままチャット欄に貼れるプロンプト例です。
現在のGitの状態と、作業中の変更を安全に一時退避・復旧する方法を教えてください。
対象: 現在のリポジトリのワーキングツリー全体
まず git status --short と git stash list で現状を確認し、復旧が必要な場合は git reflog も確認してください。
git stash pop、git stash apply、git stash drop、git stash clear、git reset --hard など、
作業ツリーや履歴を書き換える・上書きする・削除する操作を提案する場合は、
実行前に対象ファイル一覧、差分、対象のコミット・stash、影響範囲を表示してください。
私が内容を確認し、実行を許可してから進めてください。
状況や意図が不明な点があれば、推測せず確認事項として列挙してください。
このプロンプトを使うと、Claude Codeは `git status` や `git reflog` の結果を見せたうえで提案してくれるので、「知らないうちに何かを消していた」という事態を避けやすくなります。
—
アプリのドリルで実際に手を動かす
ここまでの内容は、頭で理解しただけでは本番で思い出せないことが多いです。本物のターミナルで実際にコマンドを打ち、正解かどうか即確認できる環境で練習すると、定着度がまったく変わります。
Git学習アプリの実践ドリル(全100問)には、reflogとstashを使った問題も揃っています。
- reflogで復旧するドリル(reset後のHEAD位置をたどって復元する問題など)
- stashの基本操作ドリル(push / pop / list / apply / show)
- stash応用ドリル(`-u`での未追跡ファイル退避、複数stashの整理、drop / clear)
各問にはヒントと模範解答がついているので、詰まっても安心です。
👉 github.com/maahh/git-learning-app
git clone https://github.com/maahh/git-learning-app.git
cd git-learning-app
npm install
npm run dev
ブラウザで `http://127.0.0.1:3000` を開いたら、実践ドリル一覧からreflog・stash関連の問題を探して始めてみてください。
> ※ このアプリはmacOS/Linux専用です(Windowsはnode-ptyとシェル前提が異なるため非対応)。Node.js v20以上とgitのインストールが必要です。Claude Codeを使っている方であれば、gitはほぼ準備済みのはずです。ポートが使用中で起動できない場合は、READMEの案内に従って既存プロセスを終了してから再度お試しください。
—
まとめ
- **`git reflog`** はHEADやブランチなどの参照の移動履歴をローカルに記録している。`reset –hard`で消えたコミットも、ハッシュさえ分かれば`git reset –hard
`(または`ORIG_HEAD`)で復元できる - reflogの保持期間はデフォルトで最大90日(到達不能なものは目安30日)。消した直後に対応するのが安全
- **`git stash`** は未コミットの変更を一時退避する。`pop`で戻し(成功時のみ一覧から削除)、`-u`で新規ファイルも含められる
- `reset –hard`や`stash drop`は元に戻すのが難しい操作なので、Claude Codeの提案でも実行前に対象を確認する
- 実際に手を動かして定着させるには、[git学習アプリの実践ドリル](https://github.com/maahh/git-learning-app)がおすすめです