git stash 完全ガイド|作業を一時退避して、安全にブランチを切り替える
結論:stash は「一時保存」、commit は「記録」
まだ commit したくない変更がある。でもブランチを切り替えたい。 →
git stashで退避して、戻ったらgit stash popで復元。
これだけ。8割の場面はこの2コマンドで終わる。
即決フロー
┌─────────────────────────────────────────┐
│ ブランチを切り替えたい │
│ でも作業中の変更がある │
└─────────────────────────────────────────┘
↓
┌─────────────────────────────────────────┐
│ その変更、commit できる? │
└─────────────────────────────────────────┘
↓ Yes ↓ No
┌──────────┐ ┌──────────────────────┐
│ commit │ │ git stash │
│ して移動 │ │ → 切り替え → 作業 │
└──────────┘ │ → 戻る → git stash pop│
└──────────────────────┘
基本の3コマンド
退避する
git stash
作業ディレクトリとステージの変更をすべて退避。ワーキングツリーがクリーンになる。
復元する(消す)
git stash pop
最新の stash を復元して、stash リストから削除。ほとんどの場合これを使う。
復元する(残す)
git stash apply
最新の stash を復元するが、stash リストには残す。複数ブランチに同じ変更を適用したいときだけ。
| コマンド | 復元 | stash リスト |
|---|---|---|
pop | ✓ | 削除する |
apply | ✓ | 残す |
迷ったら pop。
よく使うオプション
未追跡ファイルも含めて退避
# ✗ デフォルト:新規作成したファイルは退避されない
git stash
# ✓ 未追跡ファイルも含める
git stash -u
新しく作ったファイルが消えた? → -u を付け忘れている。
メッセージを付ける
git stash push -m "ログイン画面の途中"
複数の stash があるとき、どれがどれか分からなくなる。stash が2つ以上になりそうならメッセージ必須。
特定のファイルだけ退避
git stash push -m "CSSだけ退避" -- src/style.css src/layout.css
全部は退避したくない。一部のファイルだけ逃がしたいときに使う。
stash の管理
一覧を見る
git stash list
stash@{0}: On feature: ログイン画面の途中
stash@{1}: WIP on main: 3a1b2c3 fix header
stash@{0} が最新。番号が小さいほど新しい。
中身を確認する
# 最新の stash の差分を見る
git stash show -p
# 特定の stash の差分を見る
git stash show -p stash@{1}
復元する前に中身を確認したいときに使う。
特定の stash を復元する
git stash pop stash@{2}
最新以外の stash を復元したいときは番号を指定。
削除する
# 特定の stash を削除
git stash drop stash@{1}
# 全部削除
git stash clear
⚠️ clear は取り消せない。本当に不要か確認してから実行する。
私がやらかした失敗
stash したのを忘れて数週間
stash は通知してくれない。git stash list を定期的に確認しないと、退避した変更が永遠に眠る。
対策:stash は即日中に pop する。翌日以降に持ち越すなら commit してブランチに残す。
pop でコンフリクト
stash した後にブランチで同じファイルを編集すると、pop 時にコンフリクトが起きる。
git stash pop
# CONFLICT (content): Merge conflict in src/App.tsx
このとき stash はリストに残ったまま。コンフリクトを解決した後、手動で削除する。
# コンフリクトを解決してから
git stash drop
-u を忘れて新規ファイルが消えた(ように見えた)
# 新しいファイルを作成
touch src/NewComponent.tsx
# stash(-u なし)
git stash
# NewComponent.tsx がまだ残っている(退避されていない)
# ブランチ切り替え時にエラー
新規ファイルがあるなら -u を必ず付ける。
stash が消えた?救出方法
pop / drop した stash を復元する
# 直近の stash 操作を探す
git fsck --unreachable | grep commit
# 見つかったハッシュで中身を確認
git show abc1234
# 復元
git stash apply abc1234
git stash drop しても、Git の内部にはしばらく残っている。ただし git gc が走ると完全に消える。 早めに対処する。
stash vs commit:判断基準
| 状況 | 使うべき方法 |
|---|---|
| 数分〜数時間の一時退避 | stash |
| 翌日以降に持ち越す | commit(WIP コミット) |
| チームに共有する変更 | commit + push |
| 試しに書いたコードを保管 | commit(後で squash) |
| レビュー指摘の修正中に別件 | stash |
stash は「数時間以内に戻る」前提のもの。 長期保管には向かない。commit しろ。
まとめ
| やりたいこと | コマンド |
|---|---|
| 変更を退避 | git stash |
| 新規ファイルごと退避 | git stash -u |
| メッセージ付きで退避 | git stash push -m "内容" |
| 復元して削除 | git stash pop |
| 復元して残す | git stash apply |
| 一覧確認 | git stash list |
| 中身を確認 | git stash show -p |
| 削除 | git stash drop |
stash は一時退避。当日中に pop する。それ以上なら commit。
関連記事
- git reset と revert の使い分け — 「戻す」操作の判断基準
- git コンフリクト解消ガイド — マージ・リベース時の衝突対処