CreaTools LogoCreaTools
Tips

git stash 完全ガイド|作業を一時退避して、安全にブランチを切り替える

2026-03-09

結論: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。


関連記事