こんにちは、かつコーチです。
前回はresetとrevertという、履歴を取り消す2つの方法を解説しました。
今回扱うのは「取り消す」のではなく「一旦しまっておく」ための機能、git stashです。
作業途中で急にブランチを切り替えたくなったとき、地味に頼りになるコマンドなので、ぜひ覚えておきましょう。
git stashとは
作業途中の書類を引き出しにしまうイメージ
git stashは、作業途中で散らかった書類を、一旦引き出しにしまうようなコマンドです。
机の上に書きかけの原稿が広がっている状態で、急に別の作業を頼まれたとします。
コミットするほどまとまっていないし、かといって放置もできない。
そんなとき、書きかけの原稿一式をまるごと引き出しにしまい、机の上をきれいな状態に戻す。
これがgit stashの役割です。
しまった書類は消えたわけではなく、引き出しの中でいつでも取り出せる状態のまま保存されています。
どんな場面で使うか
git stashが活躍するのは、主に次のような場面です。
- 作業途中でブランチを切り替える必要が出てきた
- 緊急のバグ修正(hotfix)に対応しなければならなくなった
- コミットするにはまだ中途半端だが、いったん変更を退避したい
特に「今の変更をコミットするほどではないが、ブランチは切り替えたい」という状況は実務で頻繁に起こります。
前回・前々回の記事で触れた「変更を保存せずに切り替えようとしてエラーになる」という場面の、まさに解決策の1つがgit stashです。
基本の使い方
stashする
変更内容を退避させるには、git stashだけで実行できます。
# 今の変更内容をまるごと引き出しにしまう
git stash
Saved working directory and index state WIP on feature-login: a1b2c3d ログイン機能を追加
これで作業ディレクトリがきれいな状態(直前のコミット時点)に戻り、安心して別のブランチに切り替えられるようになります。
分かりやすい名前を付けておきたい場合は、-mオプションでメッセージを添えられます。
git stash -m "ログイン画面のCSS調整途中"
一覧確認:stash list
しまった書類が複数ある場合は、git stash listで一覧を確認できます。
git stash list
stash@{0}: On feature-login: ログイン画面のCSS調整途中
stash@{1}: On main: WIP on main: b2c3d4e READMEを更新
引き出しの中に、複数の書類が積み重なっているイメージです。
新しくstashしたものほど、番号が小さいstash@{0}として一番上に積まれます。
戻す:stash pop / apply
しまった内容を取り出すには、git stash popまたはgit stash applyを使います。
# 直近のstash(stash@{0})を取り出して、引き出しからも削除する
git stash pop
# 特定のstashを取り出したい場合は番号を指定する
git stash pop stash@{1}
popとapplyの違い
引き出しから取り除くか、コピーを渡すだけか
popとapplyはどちらも「変更を作業ディレクトリに戻す」点では同じですが、引き出しの中身をどうするかが異なります。
| コマンド | 作業ディレクトリへの反映 | stash一覧からの削除 |
|---|---|---|
git stash pop | される | される(取り出したら消える) |
git stash apply | される | されない(コピーを渡すだけで、原本は引き出しに残る) |
「同じ内容を複数のブランチに適用したい」といった特殊なケースではapplyを使い、通常は取り出して終わりのpopを使うことが多いです。
迷ったらpopを使う、くらいの理解で十分実務に対応できます。
よくあるつまずきポイント
stashしたまま忘れる
私が実際にやってしまった失敗が、まさにこれです。
急ぎの別作業に追われているうちに、stashしたことをすっかり忘れてしまい、数週間後にgit stash listを見たら見覚えのない退避データが3件も溜まっていた、ということがありました。
❌ Before:何をstashしたか分からない状態で放置する
git stash
メッセージなしでstashすると、後から見返したときに「これは何の変更だったか」がまったく分からなくなります。
✅ After:内容が分かるメッセージを必ず添える
git stash push -m "ログイン画面のバリデーション実装途中(2026-09時点)"
git stashではなくgit stash push -m "..."という書き方をすると、メッセージを確実に添えられます。
また、定期的にgit stash listで棚卸しをして、不要になったものはgit stash dropで削除する習慣をつけておくと安心です。
# 特定のstashを削除する
git stash drop stash@{2}
# 全部まとめて削除する(要注意)
git stash clear
コンフリクトが起きるケース
stashを取り出す際、退避してから今の作業ディレクトリで同じ箇所を編集していると、コンフリクトが起きることがあります。
git stash pop
CONFLICT (content): Merge conflict in report.txt
この場合の対処方法は、前々回解説したコンフリクト解決の手順とまったく同じです。
<<<<<<<の記号を手がかりに、ファイルを整理してgit addすれば解決できます。
応用・一歩先の使い方
-u(–include-untracked)で未追跡ファイルも退避する
デフォルトのgit stashでは、まだ一度もgit addしていない新規ファイル(未追跡ファイル)は退避対象に含まれません。
新規ファイルごと退避したい場合は、-uオプションを付けます。
# 新規作成した未追跡ファイルも含めて退避する
git stash -u
新しいファイルを作った直後にブランチを切り替える必要が出てきたときに便利なオプションです。
特定ファイルだけstashする
変更したファイルが複数あり、一部だけを退避したい場合は、対象ファイルを指定できます。
# report.txtだけを退避する
git stash push -m "report.txtのみ退避" -- report.txt
すべてをまとめて退避するのではなく、必要な部分だけをピンポイントで引き出しにしまえるので、細かい作業の整理に役立ちます。
まとめ
この記事のポイント
git stashは、作業途中の変更を「引き出しにしまう」ように一時退避できるコマンドgit stash listで退避した内容の一覧を確認できるpopは取り出して引き出しから削除、applyは取り出してもコピーが引き出しに残る- メッセージを付けずにstashすると、後から内容を思い出せなくなるので
-mオプションで説明を添える -uオプションで未追跡ファイルも、ファイル指定で一部だけの退避も可能
次に読むべき記事
resetやstashで履歴の扱いに慣れてきたら、次はもう一歩踏み込んで、rebaseとmergeの違いを理解しておきましょう。
→ 次の記事:rebaseとmergeの違い:履歴をどう残すか
タグ: Git, 中級者向け, 履歴操作