git stash の使い方:pop・apply・list・drop の違いと実践的な利用シーン

コマンドリファレンス

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 の違い

popapply はどちらも退避した変更を作業ツリーに戻すコマンドですが、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 と組み合わせてブランチ間移動を行うことが多い。
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント