「この作業途中だけど、急ぎで別の対応が必要になった…」という場面に遭遇したことはありませんか。作業中のコードをどうにか退避させて、別のタスクに取り掛かりたい。そんなときに活躍するのがgit stashコマンドです。
この記事では、git stashの基本的な使い方から実践的なユースケース、ベストプラクティスまで詳しく解説します。一時保存を使いこなせば、ブランチの切り替えや緊急対応がストレスなく行えるようになります。
git stashの概要
git stashは、作業ディレクトリの現在の状態をローカルに一時保存し、作業ツリーをクリーンな状態に戻すコマンドです。stash(スタッシュ)には「隠しておく」「しまい込む」という意味があり、まさに作業中の変更を一時的に隠しておく機能を提供します。
stashはローカルリポジトリにのみ存在し、リモートには転送されません。そのため、チームメンバーと共有する必要のない作業途中の変更を保管するのに最適です。stashはスタック構造になっており、複数の変更を保存して後から好きな順番で取り出すことができます。
基本操作
変更を一時保存する
作業中の変更をstashに保存するには、git stashまたはgit stash pushを実行します。
# 変更を一時保存(インデックスとワーキングツリーの両方)
git stash
# メッセージ付きで保存(推奨)
git stash push -m "WIP: ユーザー認証機能を実装中"メッセージを付けておくと、後でstash一覧を見たときに何の作業だったか一目でわかります。特に複数のstashを抱えている場合は、メッセージがないと混乱の原因になります。
stash一覧を確認する
保存したstashの一覧はgit stash listで確認できます。
git stash list
# 出力例:
# stash@{0}: On main: WIP: ユーザー認証機能を実装中
# stash@{1}: On feature: APIエンドポイントの追加作業stash@{0}が最新のstashで、番号が大きくなるほど古いものになります。
stashを適用する
保存した変更を取り出すには、git stash popまたはgit stash applyを使用します。
# stashを適用して削除(最も一般的な使い方)
git stash pop
# stashを適用(削除しない)
git stash apply
# 特定のstashを適用
git stash apply stash@{1}popとapplyの違いは、適用後にstashを削除するかどうかです。popは適用と同時にstashを削除し、applyはstashを残したまま適用します。複数のブランチで同じ変更を適用したい場合はapplyが便利です。
stashの内容を確認する
適用前にstashの内容を確認したい場合はgit stash showを使います。
# 変更されたファイル一覧を表示
git stash show stash@{0}
# 差分の詳細を表示
git stash show -p stash@{0}
# ファイル名のみ表示
git stash show --name-only stash@{0}stashを削除する
不要になったstashは明示的に削除しましょう。
# 特定のstashを削除
git stash drop stash@{0}
# すべてのstashを削除(注意: 取り消し不可)
git stash cleargit stash clearは一度実行すると元に戻せないため、事前にgit stash listで内容を確認してから実行してください。
便利なオプション
未追跡ファイルも含める(-u)
デフォルトでは、stashはトラッキングされているファイルの変更のみを保存します。新しく作成したファイルも含めたい場合は-uオプションを使用します。
# 未追跡ファイルも含めてstash
git stash -u -m "新規ファイルを含む作業"ステージング済みファイルを保持(-k)
ステージングした変更はそのままにして、ステージングしていない変更だけをstashしたい場合は-kオプションが便利です。
git add file1.js
git stash -k -m "未ステージの変更のみ保存"
# file1.jsはステージングされたまま、他の変更がstashされるステージング済みの変更のみ保存(–staged)
逆に、ステージング済みの変更だけをstashすることも可能です。
git add file1.js file2.js
git stash --staged -m "ステージング済みの変更のみ"
# file1.jsとfile2.jsだけがstashされる対話的に変更を選択(-p)
変更の一部だけをstashしたい場合は、-pオプションで対話的に選択できます。
git stash -p
# 各変更について y/n で保存するか選択実践的なユースケース
緊急対応が必要になった場合
機能開発中に本番環境でバグが発生し、すぐに修正が必要になった場面を想像してください。
# 作業中の変更をstash
git stash -m "WIP: 新機能の実装途中"
# mainブランチに切り替えて修正
git checkout main
# (バグ修正を行う)
git commit -a -m "fix: 緊急バグ修正"
git push
# 元のブランチに戻って作業再開
git checkout feature-branch
git stash poppullする前に変更を退避
リモートの変更を取り込みたいが、ローカルに未コミットの変更がある場合にもstashが活躍します。
git stash -m "pull前の一時退避"
git pull
git stash pop
# コンフリクトがあれば手動で解決別ブランチに変更を移動
間違ったブランチで作業を始めてしまった場合、stashを使って正しいブランチに変更を移動できます。
# 現在のブランチでstash
git stash -m "別ブランチに移動する変更"
# 正しいブランチに切り替え
git checkout correct-branch
# stashを適用
git stash popstashからブランチを作成
stashを適用したときにコンフリクトが発生しそうな場合、stashから直接新しいブランチを作成する方法があります。
git stash branch new-feature stash@{0}
# stash時点のコミットから新ブランチを作成し、stashを適用
# 適用後、stashは自動的に削除されるこの方法なら、stashを作成した時点のコードベースでブランチが作られるため、コンフリクトを避けられます。
部分的なコミットのテスト
一部の変更だけをコミットしたいが、コミット前にその変更が正しく動作するかテストしたい場合の手順です。
# 一部の変更をステージング
git add --patch feature.js
# ステージングしていない変更をstash
git stash -k -m "テスト用に一時退避"
# ステージング済みの変更だけでテスト実行
npm test
# 問題なければコミット
git commit -m "feat: 新機能を追加"
# 残りの変更を復元
git stash popgit stashとgit commitの使い分け
stashとcommitはどちらも変更を保存しますが、目的が異なります。
| 観点 | git stash | git commit |
|---|---|---|
| 可視性 | ローカルのみ | 履歴の一部として共有可能 |
| 履歴 | 一時的な保存場所 | 永続的な履歴 |
| 用途 | 短期的な変更退避 | 意味のある変更の記録 |
| リモート | pushされない | pushで共有可能 |
stashは「ちょっと横に置いておく」感覚で使い、commitは「意味のある単位で履歴に残す」ために使います。1週間以上保持するような変更であれば、WIPコミットとしてブランチに保存する方が安全です。
ベストプラクティス
説明メッセージを必ず付ける
stashには必ず-mオプションでメッセージを付けましょう。「あのstashは何だったっけ?」と悩む時間がなくなります。
# 良い例
git stash -m "WIP: ユーザー登録フォームのバリデーション実装中"
# 悪い例(メッセージなし)
git stashstashは短期利用に限定する
stashはあくまで一時的な保存場所です。数日以上放置すると、何の変更だったか忘れてしまいます。長期間保持する必要があるなら、ブランチを作成してコミットしてください。
定期的にstashをクリーンアップする
git stash listで古いstashが溜まっていないか確認し、不要なものはgit stash dropで削除しましょう。
# 一覧確認
git stash list
# 古いstashを削除
git stash drop stash@{3}適用前に内容を確認する
特に古いstashを適用する前は、git stash show -pで内容を確認してから適用すると安全です。
よくある問題と解決策
stash適用時にコンフリクトが発生した
git stash popでコンフリクトが発生した場合、stashは削除されずに残ります。手動でコンフリクトを解決した後、明示的にstashを削除する必要があります。
git stash pop
# コンフリクト発生!
# コンフリクトを手動で解決
git add resolved-file.js
# popが失敗したのでstashが残っている → 明示的に削除
git stash drop誤ってclearしてしまった
git stash clearで全てのstashを削除してしまった場合、回復は困難ですが、試みることは可能です。
# 回復を試みる(成功保証なし)
git fsck --unreachable | grep commit | cut -d\ -f3 | xargs git log --merges --no-walk --grep=WIPただし、成功率は高くありません。重要な変更は早めにコミットするか、clearの前に必ずlistで確認する習慣をつけましょう。
特定のstashだけ適用したい
複数のstashがある場合、インデックスを指定して特定のstashを適用できます。
git stash list
# stash@{0}: WIP on main: abc123 最新の作業
# stash@{1}: On feature: def456 この作業を適用したい
git stash apply stash@{1}stashの参照方法
stashを参照する方法はいくつかあります。
| 形式 | 説明 |
|---|---|
stash@{0} | 最新のstash |
stash@{1} | その前のstash |
stash@{2.hours.ago} | 2時間前のstash |
0, 1, 2 | stash@{n}の短縮形(一部コマンドで使用可) |
まとめ
git stashは、作業の中断と再開をスムーズに行うための強力なツールです。緊急対応が必要になったとき、ブランチを切り替えたいとき、pullする前に変更を退避したいときなど、日常的な開発作業で頻繁に役立ちます。
効果的に活用するポイントは3つです。まず、必ずメッセージを付けて保存すること。次に、短期利用に限定して長期間放置しないこと。そして、定期的にstash一覧を確認してクリーンアップすることです。
これらを意識してstashを使いこなせば、作業の切り替えがストレスフリーになり、開発効率が向上します。



