
開発作業の途中で「今すぐ別のブランチに切り替えて緊急のバグ修正をしてほしい」と依頼されたり、「作業中のコードをまだコミットしたくないけれど、最新コードを取り込みたい」という場面に遭遇したことはないでしょうか。
中途半端な状態でコミットしてしまうと、コミット履歴が乱れてしまったり、ビルドが通らないコードが残ってしまう恐れがあります。一方で変更を破棄してしまうと、今まで書いていたコードが失われてしまいます。
そんなときに役立つのが、Gitで変更内容を一時的に別の安全な場所へ退避できる「git stash」コマンドです。
この記事では、git stashの基本的な仕組みから、日常業務で必須となる作業の一時退避・復元・一覧確認・削除まで、よく使うコマンドを実例付きで詳しく解説します。
この記事で行うこと
前提条件・対象読者
【結論】よく使うgit stash基本コマンド一覧表
日常の実務で頻繁に使うgit stashの主要コマンドを一覧表にまとめました。まずはこの表で全体像を確認してください。
| 操作内容 | 実行コマンド | 解説・主な用途 |
|---|---|---|
| 一時退避(変更のみ) | git stash または git stash push | 追跡中ファイルの未コミット変更を一時退避する |
| メッセージ付きで退避 | git stash push -m "メモ" | 後から識別しやすいようにコメントを付けて退避する |
| 新規作成ファイルも含めて退避 | git stash push -u | git add前の新規ファイル(Untracked)も一緒に退避する |
| メッセージ付き+新規ファイル退避 | git stash push -u -m "メモ" | 実務で最も安全かつ推奨される退避コマンド |
| 退避一覧を確認 | git stash list | 保存されているstashの一覧(識別子とメッセージ)を表示 |
| 退避内容の差分を確認 | git stash show -p [stash@{0}] | 退避した変更の具体的なコード差分(diff)を表示 |
| 最新の退避を復元して削除 | git stash pop | 最新のstashを作業ツリーに戻し、stash一覧から削除する |
| 最新の退避を復元して残す | git stash apply | 最新のstashを作業ツリーに戻すが、stash一覧には残す |
| 特定の退避を指定して復元 | git stash pop stash@{1} | 指定したインデックスのstashを復元して削除する |
| 特定の退避を指定して削除 | git stash drop stash@{0} | 不要になった特定のstashを削除する |
| すべての退避を一括削除 | git stash clear | 保存されているすべてのstashを完全に削除する |
補足として、古い解説記事でよく見かける git stash save は現在非推奨(deprecated)となっています。現在のGitでは git stash push を使用することが公式に推奨されています。
git stash の基本概念と仕組み
git stashを使いこなすために、まずはGitのデータ構造の中でstashがどのような役割を果たしているのかを理解しましょう。

Gitには通常、次の3つの主要エリアがあります。
- ワークツリー(作業ディレクトリ): 実際にファイルを編集している場所
- ステージングエリア(インデックス): コミット予定のファイルを登録する場所
- ローカルリポジトリ: コミットとして履歴が確定・保存される場所
git stash を実行すると、ワークツリーおよびステージングエリアにある「コミット前の変更差分」を一時的な退避領域(stash)に保存し、作業ツリーを直前のコミット(HEAD)のクリーンな状態へと戻します。
stash領域は「スタック構造(後入れ先出し:LIFO)」になっており、退避を行うたびに新しいデータが上に積み重なります。最新の退避データには常に stash@{0} というインデックスが割り当てられ、それ以前のものは stash@{1}、stash@{2} と順番に番号が繰り下がっていきます。
作業中の一時退避とメッセージ付き退避(git stash push -m / -u)
ここからは、実際に作業内容を退避する手順を具体的に見ていきましょう。
基本の一時退避(git stash または git stash push)
最もシンプルな退避コマンドは git stash です。引数を指定しない場合、自動的に git stash push として実行されます。
# 作業ツリーの状態を確認
$ git status
On branch feature/login
Changes not staged for commit:
modified: src/login.ts
# 変更を退避
$ git stash
Saved working directory and index state WIP on feature/login: a1b2c3d Add initial form
# クリーンな状態に戻ったことを確認
$ git status
On branch feature/login
nothing to commit, working tree clean
このように、変更中だった src/login.ts の内容が安全に退避され、作業ツリーは何もないクリーンな状態に戻ります。
メッセージを付けて退避する(git stash push -m)
単に git stash を実行すると、自動的に直前のコミットメッセージが退避名として記録されます。しかし、後から複数の一時退避を見返したときに「何の作業をしていたのか」が分からなくなる原因になります。
実務では、以下のように -m オプションを付けてわかりやすいメッセージを残すのがおすすめです。
git stash push -m "ログインボタンのバリデーション処理途中"
これにより、一覧表示した際に作業内容が一目で判別できるようになります。
新規作成ファイルも含めて退避する(git stash push -u)
初心者がgit stashを使う際、最もつまずきやすいのが「新規作成したファイルが退避されない」という問題です。
通常の git stash では、Gitで一度も追跡されていない新規ファイル(Untracked files)は退避対象外となり、作業ディレクトリにそのまま残ってしまいます。
新規作成したファイルも含めて丸ごと退避したい場合は、-u(または --include-untracked)オプションを付与します。
# 新規ファイルが存在する状態で退避
$ git stash push -u -m "新規認証モジュール作成途中"
このコマンドを使うことで、既存ファイルの編集差分だけでなく、新しく作成したファイルも漏れなくstashに退避されます。
実務で安全に作業を一時中断したい場合は、常に git stash push -u -m "メッセージ" を使う習慣をつけておくと安心です。
退避した作業の復元方法(pop と apply の違い)
退避した変更を作業ツリーに戻すコマンドには、主に pop と apply の2種類があります。この2つの違いを正しく理解して使い分けましょう。
git stash pop:復元と同時にstash一覧から削除する
git stash pop は、最新のstash(stash@{0})を作業ツリーに復元し、同時にそのstashを退避リストから自動的に削除します。
$ git stash pop
On branch feature/login
Changes not staged for commit:
modified: src/login.ts
Dropped stash@{0} (f4b5c6d...)
日常的な開発で「退避した作業をそのまま再開する」という場合は、不要な退避データがたまらない pop を使うのが基本です。
注意点として、復元時に別のコミットとの間で競合(コンフリクト)が発生した場合、Gitは安全のためにstashリストからデータを自動削除せず残します。競合を解消したあとで、手動で削除を行う必要があります。
git stash apply:復元するがstash一覧には残す
git stash apply は、退避した変更を作業ツリーに適用しますが、stash一覧から退避データを削除しません。
$ git stash apply
On branch feature/login
Changes not staged for commit:
modified: src/login.ts
apply は以下のようなシーンで非常に重宝します。
特定のstashを指定して復元する
過去に複数回退避を行っている場合、インデックス番号を指定することで、最新以外のstashを復元できます。
# stash@{1} を復元して削除する場合
git stash pop stash@{1}
# stash@{2} を復元して一覧には残す場合
git stash apply stash@{2}
ステージング状態(git add の状態)も復元したい場合
通常、git stash pop や apply で復元すると、退避前に git add していたファイルもすべてステージング前の状態(Unstaged)に戻ります。
もしステージングエリアの状態もそのまま再現したい場合は、--index オプションを付けて実行します。
git stash pop --index
退避一覧の確認と差分確認(git stash list / show -p)
過去に保存したstashの履歴や、具体的な変更差分を確認するコマンドです。
退避一覧を確認する(git stash list)
現在保存されているすべてのstashを確認するには、git stash list を実行します。
$ git stash list
stash@{0}: On feature/login: ログインボタンのバリデーション処理途中
stash@{1}: On feature/auth: 新規認証モジュール作成途中
stash@{2}: WIP on main: 1a2b3c4 Initial commit
各行の構成は次のようになっています。
stash@{N}: stashの識別番号(インデックス)On [ブランチ名]: 退避を実行した時点のブランチ- 末尾の文字列:
-mで指定したメッセージ、または自動生成されたメッセージ
退避内容の概要を確認する(git stash show)
特定のstashで「どのファイルが何行変更されたか」の概要を確認したいときは、git stash show を使います。
$ git stash show stash@{0}
src/login.ts | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
インデックスを省略した場合は、最新の stash@{0} の概要が表示されます。
退避した具体的なコード差分を確認する(git stash show -p)
ファイル名だけでなく、「具体的にどの行をどのように書き換えたのか」というコード差分を確認したい場合は、-p(または --patch)オプションを付けます。
$ git stash show -p stash@{0}
diff --git a/src/login.ts b/src/login.ts
index 1234567..89abcde 100644
--- a/src/login.ts
+++ b/src/login.ts
@@ -10,4 +10,10 @@ export function validateLogin(email: string) {
+ if (!email.includes('@')) {
+ return false;
+ }
+ return true;
}
復元する前に「このstashに何が書かれていたか」を確認できるため、誤ったstashを復元してしまうミスを防ぐことができます。
不要になった退避の削除(drop と clear)
復元が完了して不要になったstashや、古い退避データは定期的に削除して整理しましょう。
特定のstashを個別に削除する(git stash drop)
指定した特定のstashだけを削除するには、git stash drop を使用します。
# 最新の stash@{0} を削除
git stash drop stash@{0}
# 過去の stash@{2} をピンポイントで削除
git stash drop stash@{2}
インデックスを省略した場合は、最新の stash@{0} が削除対象になります。削除すると、それ以降のインデックス番号が1つずつ繰り上がります。
すべてのstashを一括削除する(git stash clear)
保存されているすべてのstashをまとめて消去したいときは、git stash clear を実行します。
# すべての退避データを完全消去
git stash clear
# 一覧が空になったことを確認
$ git stash list
(何も表示されない)
注意点として、git stash clear を実行すると過去の退避内容がすべて消去され、通常のコマンドでは元に戻せなくなります。実行前には必ず git stash list で中身を確認し、消しても問題ないかを確かめてから実行してください。
実務でよくあるシーン別の使い分け
日常の開発現場でgit stashが活躍する典型的なユースケースと、具体的な操作の流れを紹介します。
シーン1:作業中に緊急のバグ修正が割り込んだ場合
最も頻繁に遭遇するシチュエーションです。作業途中の状態を退避し、別ブランチで修正を行ってから作業を再開します。
# 1. 作業中の変更(新規ファイル含む)にメモを付けて退避
git stash push -u -m "機能Aの実装途中"
# 2. 緊急修正用ブランチへ切り替え
git switch hotfix/urgent-bug
# 3. バグを修正してコミット&プッシュ
git add .
git commit -m "Fix urgent production bug"
git push origin hotfix/urgent-bug
# 4. 元の開発ブランチに戻る
git switch feature/feature-a
# 5. 退避していた作業内容を復元して作業再開
git stash pop
コミット履歴を汚すことなく、瞬時にブランチを行き来して作業を切り替えることができます。
シーン2:最新のコードを git pull したいのにコンフリクトしそうな場合
ローカルで作業を進めている最中にリモートで更新があり、git pull しようとすると「Please commit your changes or stash them before you merge」というエラーが出ることがあります。
このような場合もstashを活用します。
# 1. 変更を一時退避
git stash push -u -m "pull前のローカル変更一時退避"
# 2. リモートの最新変更を取得
git pull origin main
# 3. 退避していた自分の変更を復元
git stash pop
もし git stash pop した際に同じ行が競合した場合は、ファイル内にコンフリクトマーカー(<<<<<<<, =======, >>>>>>>)が挿入されます。エディタで衝突箇所を修正し、git add して解消してください。
シーン3:退避した内容から直接新しいブランチを作成したい場合(git stash branch)
「作業を退避したけれど、元のブランチではなく新しいブランチを切り出してそこで作業を続けたい」という場合に便利なのが git stash branch です。
git stash branch feature/new-idea stash@{0}
このコマンドを実行すると、stashを作成した時点のコミットから新しいブランチが作成され、退避していた変更が自動的に復元されます。復元に成功すると、対象のstashはリストから自動的に削除されます。
古い退避データを作業ツリーに戻そうとして大量のコンフリクトが発生しそうなときにも、安全に検証環境を作れる有効な手段です。
よくある質問(FAQ)
Q1. git stash save と git stash push の違いは何ですか?
A. 機能としてはほぼ同じですが、git stash save は現在「非推奨(deprecated)」と位置づけられています。
以前のバージョンではコメントを付ける際に git stash save "メッセージ" が使われていましたが、特定のファイルだけを指定して退避する機能などに対応していませんでした。そのため、Git 2.16以降ではより柔軟で一貫性のある git stash push が標準となりました。今後は git stash push -m "メッセージ" を使うようにしましょう。
Q2. git stash したのに新しいファイルが消えずに残っています。なぜですか?
A. git add を行っていない新規作成ファイル(Untracked files)は、通常の git stash では対象外となるためです。
新規ファイルも含めて退避したい場合は、必ず -u オプションを付けて git stash push -u(または git stash -u)を実行してください。
Q3. 間違えて git stash drop や clear を実行してしまった場合、復元できますか?
A. 削除直後であれば、Gitのオブジェクトデータベースに残っている可能性があるため、復元できる場合があります。
git fsck --lost-found コマンドを実行して孤立したコミットハッシュ(dangling commit)を探し、git show [ハッシュ] で中身を確認した上で、git merge [ハッシュ] や git cherry-pick [ハッシュ] を行うことで復旧できるケースがあります。ただし確実ではないため、clear や drop を実行する際は事前の確認が重要です。
まとめ
今回は、Gitで作業内容を一時退避・復元できる git stash の使い方について詳しく解説しました。
要点を振り返ります。
git stashを使いこなせるようになると、急な割り込みタスクやブランチの切り替えにも慌てず柔軟に対応できるようになります。ぜひ日々の開発業務で活用してみてください。
次に読むおすすめ記事
Gitの全体像や基本コマンド、ブランチ運用、トラブル解決手順を体系的に学びたい方は、以下の完全ガイドもあわせて参考にしてください。


