git stash は、作業中の変更を一時的に退避して作業ディレクトリをクリーンな状態に戻すコマンドです。別ブランチへの緊急切り替えや、作業途中での退避に使われる場面が多く、pop / apply / list / drop など関連サブコマンドの違いを押さえておくと実務で迷わなくなります。
git stash の基本的な使い方
変更を退避する(git stash / git stash push)
作業ツリーとステージングエリアの変更をまとめて退避します。
git stash
# または
git stash push
実行後、作業ディレクトリはクリーンになります。
Saved working directory and index state WIP on main: 1a2b3c4 Update README
メッセージ付きで退避する
後で git stash list したときに内容を判別しやすくするため、メッセージを付けておくと便利です。
git stash push -m "WIP: ログイン機能の途中"
未追跡ファイルも含めて退避する
デフォルトでは git add していない新規ファイル(untracked)は退避対象外です。-u オプションを付けると untracked ファイルも退避できます。
git stash push -u
| オプション | 退避対象 |
|---|---|
| なし | 変更済みファイル・ステージ済みファイル |
-u / --include-untracked | 上記 + 未追跡ファイル |
-a / --all | 上記 + .gitignore で無視されているファイル |
git stash list – 退避した変更の一覧を確認する
git stash list で退避済みの stash 一覧を確認できます。
git stash list
stash@{0}: On main: WIP: ログイン機能の途中
stash@{1}: WIP on develop: 9z8y7x6 Add API endpoint
stash@{0} が最新で、番号が大きいほど古い stash です。特定の stash の差分を確認したい場合は git stash show -p を使います。
git stash show -p stash@{0}
git stash pop と apply の違い
pop と apply はどちらも退避した変更を作業ツリーに戻すコマンドですが、stash エントリを削除するかどうかが異なります。
| コマンド | 変更を戻す | stash エントリを削除する |
|---|---|---|
git stash pop | ○ | ○(戻した後に自動削除) |
git stash apply | ○ | ×(stash が残る) |
git stash pop – 取り出して削除
最新の stash を作業ツリーに戻し、stash エントリを削除します。最もよく使うコマンドです。
# 最新の stash を取り出す
git stash pop
# 番号を指定して取り出す
git stash pop stash@{1}
git stash apply – 取り出しても残す
変更を戻した後も stash エントリが残ります。同じ変更を複数ブランチに適用したい場合に便利です。
# 最新の stash を取り出す(stash は残る)
git stash apply
# 番号を指定して取り出す
git stash apply stash@{1}
どちらを使うべきか
通常は git stash pop で問題ありません。同じ stash を複数のブランチに適用したい場合や、コンフリクトが起きた際に stash を手元に残しておきたい場合は git stash apply を選びます。
git stash drop – stash を削除する
不要になった stash エントリを個別に削除します。
# 最新の stash を削除
git stash drop
# 番号を指定して削除
git stash drop stash@{1}
git stash clear – すべての stash を削除する
すべての stash エントリを一括削除します。元に戻せないため注意が必要です。
git stash clear
| コマンド | 削除対象 |
|---|---|
git stash drop | 最新の stash エントリ 1件 |
git stash drop stash@{n} | 指定した stash エントリ 1件 |
git stash clear | すべての stash エントリ |
よくある利用シーン
緊急のバグ修正が入ったとき
feature ブランチで作業中に、本番バグの緊急修正を依頼されたケースです。
# 作業中の変更を退避
git stash push -m "WIP: ユーザー登録フォーム"
# main ブランチに切り替えてバグ修正
git switch main
# ... バグ修正 → commit → push ...
# feature ブランチに戻って退避を復元
git switch feature/user-registration
git stash pop
ブランチを間違えて作業してしまったとき
main ブランチで直接作業してしまったような場合に、変更を正しいブランチに移せます。
# 誤って main で作業した変更を退避
git stash
# 正しいブランチに切り替えて復元
git switch feature/correct-branch
git stash pop
コードレビューのために別ブランチを確認するとき
レビューリクエストが来たが、今の作業途中でコミットしたくない場合に使います。
# 作業中の変更を退避
git stash
# レビュー対象ブランチを確認
git switch review/pr-123
# ... レビュー作業 ...
# 元のブランチに戻って復元
git switch feature/my-task
git stash pop
同じ変更を複数ブランチに適用するとき
共通の設定変更を複数のブランチに適用したい場合は apply を使うと stash が残るので便利です。
# 変更を退避
git stash push -m "共通設定ファイルの変更"
# ブランチ A に適用(stash は残る)
git switch branch-a
git stash apply
# ブランチ B にも適用
git switch branch-b
git stash apply
# 不要になったら削除
git stash drop
git stash でよくあるミスと対処法
pop / apply 時にコンフリクトが発生したとき
退避していた変更と現在のブランチの変更が競合するとコンフリクトが発生します。git stash pop はコンフリクト時に stash エントリを自動削除しません(apply と同じ挙動になります)。
# コンフリクトを手動で解消後
git add .
# stash エントリは残っているので手動で削除
git stash drop
untracked ファイルが退避されていないとき
新規作成したファイルが stash に含まれていない場合は、-u オプションを忘れているケースがほとんどです。
git stash push -u
stash の番号がズレたとき
新しい stash が積まれると既存の番号がずれます。番号ではなくメッセージで管理するか、操作前に git stash list で番号を確認する習慣をつけましょう。
サブコマンド一覧まとめ
| コマンド | 説明 |
|---|---|
git stash / git stash push | 変更を退避する |
git stash push -m "メッセージ" | メッセージ付きで退避する |
git stash push -u | 未追跡ファイルも含めて退避する |
git stash list | 退避済み stash の一覧を表示する |
git stash show -p stash@{n} | 指定した stash の差分を確認する |
git stash pop [stash@{n}] | 退避を戻してエントリを削除する |
git stash apply [stash@{n}] | 退避を戻す(エントリは残す) |
git stash drop [stash@{n}] | 指定した stash エントリを削除する |
git stash clear | すべての stash エントリを削除する |
関連コマンド
変更の取り消し・退避周辺で一緒に押さえておくと便利なコマンドです。
- git reset:コミット履歴やステージングを取り消す。stash と異なりコミット単位での巻き戻しに使う。
- git checkout:ブランチの切り替えや特定ファイルの復元に使う。stash と組み合わせてブランチ間移動を行うことが多い。

コメント