git stash完全ガイド|一時退避から応用・トラブル対策までわかりやすく解説

コマンドリファレンス

作業中のコードをコミットせずに一時的に退避させたい… そんなときに活躍するのが git stash コマンドです。

Gitを使った開発では、「今の作業を中断して、急ぎのバグ修正に対応したい」「複数のタスクを並行して進めたい」など、状況に応じて柔軟に作業を切り替える必要が出てきます。
git stash は、現在の作業状態を一時保存し、あとから元に戻せる便利なツールです。

この記事では、Git初心者にもわかりやすく git stash の基本的な使い方から、応用テクニック、トラブル対応、さらにはベストプラクティスまでを網羅的に解説します。
作業効率を高めたい方や、git stashをなんとなく使っていた方にも、確かな理解と活用のヒントをお届けします。

【チートシート】よく使うgit stashコマンド一覧

「とりあえずコマンドだけ知りたい!」という方のために、よく使う git stash コマンドをまとめました。

やりたいことコマンド備考
作業を退避するgit stash変更を一時保存して作業ツリーをクリーンにする
メモ付きで退避するgit stash push -m "メモ"後から見て分かりやすいようにメッセージを残す
退避した一覧を見るgit stash listスタッシュされている作業のリストを表示する
作業を戻す(消す)git stash pop最新の退避を復元し、スタッシュ一覧から削除する
作業を戻す(残す)git stash apply最新の退避を復元するが、スタッシュ一覧には残す
特定の退避を削除するgit stash drop stash@{0}指定したスタッシュを削除する
すべての退避を削除するgit stash clearスタッシュ一覧をすべてクリアする

はじめに:git stashって何?

git stash は、作業中の変更を一時的に保存して作業ディレクトリをクリーンな状態に戻すための Git のコマンドです。現在の変更をコミットせずに退避させることで、別のブランチでの作業や緊急対応などにスムーズに移行できるようになります。

たとえば、新しい機能を開発している途中に、緊急のバグ修正を行う必要が生じたとします。このとき、作業中の変更をそのままにしてブランチを切り替えると、競合が発生したり、未コミットの変更が混在したりして作業が煩雑になります。こうした場面で git stash を使えば、現在の作業状態を一時的に退避させておき、修正作業が終わった後に元の状態へスムーズに復元することができます。

stash された変更はスタック(積み重ね)構造で管理されており、複数の作業状態を順に退避・復元することも可能です。また、退避する際にメモをつけたり、未追跡ファイルも含めたりといった柔軟な操作もできます。

Git を使った日々の開発作業において、git stash は単なる一時避難所ではなく、タスクの切り替えや作業の整理をスムーズに進めるための強力な武器になります。本記事では、その基本から応用までを丁寧に解説していきます。

【目的別】git stashの基本コマンド一覧

git stash の基本操作を、目的別に詳しく解説します。

作業中の変更を退避する

最もシンプルな使い方は以下のコマンドです。

git stash

このコマンドを実行すると、ステージングされていない変更(作業ツリーの変更)と、ステージング済みの変更(インデックスの状態)がまとめて退避され、作業ディレクトリはクリーンな状態になります。

より明示的な書き方としては、以下のようにメモ付きで保存することもできます。

git stash push -m "新機能の途中"

-m オプションを使うことで、どんな作業をstashしたのかをあとで見返しやすくなります。

退避した作業の一覧・中身を確認する方法

stashされた変更の一覧は、以下のコマンドで確認できます。

git stash list

出力例:

stash@{0}: On main: 新機能の途中
stash@{1}: On main: バグ修正前の状態

それぞれ stash@{0}stash@{1} のように番号が割り振られ、スタックとして管理されています。数字が小さいほど新しいスタッシュです。

中身の差分を詳しく見たい場合は、git stash show -p を使います。

git stash show -p stash@{0}

退避した作業を戻す(復元する)方法

stashした内容を再び作業ディレクトリに戻すには applypop を使います。この2つの違いを理解しておくことが重要です。

① スタッシュを残したまま戻す(apply)

git stash apply stash@{0}

このコマンドは内容を復元しますが、stash自体は削除されず一覧に残ります。適用後にコンフリクトが起きた場合でも、スタッシュが残っているため安全です。

② スタッシュを削除しつつ戻す(pop)

git stash pop stash@{0}

適用と同時にstashのスタックからも削除されます。「もうこのスタッシュは不要だ」と確信できる場合に使います。

退避した作業を削除する

作業を終えたあとに不要になったstashを手動で削除する場合は、次のようにします。

git stash drop stash@{0}

すべてのstashを一括で削除するには、以下のコマンドを使用します。

git stash clear

新しいブランチを作って復元する

退避した内容を新しいブランチとして切り出したい場合には、以下のように stash branch を使うと便利です。

git stash branch fix-bug stash@{0}

この操作により、指定したstashを反映した新しいブランチが作成され、元の変更を引き継いで作業を続けることができます。


使用例で理解するgit stashの活用シーン

git stash は、単なる一時退避ツールにとどまらず、実際の開発現場で非常に役立つ場面が多くあります。ここでは、具体的なシナリオを挙げながら、どのような場面で git stash を使うと便利なのかを解説します。

急なバグ修正の対応

開発中に突然、リリース済みのバージョンに関するバグ修正依頼が来ることがあります。現在の作業はコミット前で中断したくない、しかし一旦対応しなければならない。そんなときに git stash を使えば、作業中の状態を保存しておいて別のブランチに切り替えることができます。

git stash push -m "作業中の機能A"
git checkout release-branch
# バグ修正を行う

修正が完了した後、元の作業に戻り、stashを復元するだけでOKです。

git checkout feature-A
git stash pop

複数タスクを並行して進めたいとき

複数の開発タスクを並行して進める場合、それぞれのブランチを切り替えるたびに変更内容をどう扱うかが課題になります。git stash を使えば、作業ごとに一時保存しておけるため、ブランチの切り替えが柔軟になります。

git stash push -m "機能A:画面の見た目調整"
git checkout feature-B

タスクごとに適切なタイミングで stash popapply を使って変更を戻すことで、作業の混在やミスを防げます。

作業を一時的に保留したいとき

「ちょっと席を外す」「会議に呼ばれた」「一旦別のことをやらなきゃ」など、開発中に一時中断せざるを得ないシーンもよくあります。そんなとき、ステージングせずに手軽に保存できる git stash は非常に便利です。

git stash push -m "途中経過"

変更を失う心配なく中断できることで、安心して作業に戻ることができます。


特定のファイルだけ退避・復元したい場合の応用テクニック

基本的な git stash の使い方をマスターしたら、さらに細かく柔軟に操作できる応用テクニックも覚えておくと便利です。ここでは、特定ファイルだけをstashに含めたり、部分的に復元したりする方法を紹介します。

未追跡ファイルもstashする(-u / –include-untracked)

デフォルトでは、git stash は未追跡ファイル(git add していない新規作成ファイル)を含めません。これらも一緒に退避したい場合は、以下のように -u オプションを使います。

git stash push -u

インタラクティブに変更を選んでstashする(–patch)

すべての変更を一括でstashするのではなく、「この変更はstashしたいけど、これは残しておきたい」といった細かい制御が必要なこともあります。そんなときに使えるのが --patch(または -p)オプションです。

git stash push -p

このコマンドを実行すると、変更内容ごとに「stashするかどうか」を確認するプロンプトが表示され、細かく選択できます。

特定ファイルだけ復元する(Git 2.23以降)

stashされた変更のうち、特定のファイルだけを元に戻したい場合には git restore コマンドを使うと便利です。

git restore -s stash@{0} -- path/to/file

この方法では、stashの中にある指定ファイルだけを選んで復元できるため、大きな変更の一部だけを戻したいときに重宝します。


トラブルシューティングと注意点

スタッシュを適用したらコンフリクト(競合)が起きた

git stash applypop を実行した際、スタッシュ内の変更と現在の作業ディレクトリの内容に差異があると、競合(コンフリクト)が発生することがあります。

対処法:

  1. コンフリクトのあったファイルを確認(Gitが自動でマーキングします)
  2. エディタで手動で修正し、git add でステージング
  3. 必要に応じて git commit で確定

もし「やっぱりスタッシュの適用をやめたい」という場合は、以下のコマンドで作業ツリーをリセットできます(ただし、スタッシュ適用前の未コミットの変更も消えるので注意してください)。

git reset --hard HEAD

git stash pop のあとに内容が消えた

git stash pop は適用後にスタッシュを削除します。もし適用に失敗したり、競合中に操作を誤ると、変更内容が失われる可能性があります。

安全策:内容を残しておきたいときは、apply を使って、適用後に手動で drop する方が安全です。

git stash apply stash@{0}
# 問題なく適用されたことを確認してから
git stash drop stash@{0}

間違って stash drop や clear を実行してしまった

dropclear を実行すると、スタッシュは即座に削除され、基本的には元に戻せません。ただし、Gitの内部履歴を使って一部の情報を取り戻せる可能性があります。

対処法(上級者向け):

git fsck --lost-found

または

git reflog

を使って、該当するオブジェクトハッシュを探し、そこから手動で内容を復元することができる場合があります。

stash が増えすぎて管理しづらい

git stash list を確認すると、過去の作業が大量に残っていて、どれが必要か分からなくなることがあります。

対処法:

  • push -m でメモを残す習慣をつける
  • 古いスタッシュを定期的に dropclear で整理する
  • 必要な内容はなるべく早めに apply してブランチにコミットしておく

git stashを使う際のベストプラクティス

  1. スタッシュには必ずメモをつける
    -m オプションを使って何の作業か分かるようにしましょう。
  2. 一時的な用途にとどめる
    スタッシュは短期的な一時保管が目的です。中長期の作業管理はブランチ運用に切り替えるのが安全です。
  3. applyとpopの違いを理解して使い分ける
    安全に復元したい場合は apply を使いましょう。
  4. 未追跡ファイルを含めるかどうか意識する
    新規作成ファイルがある場合は -u オプションを忘れないようにしましょう。
  5. ブランチを分けた方が良い場合は早めに切り替える
    ある程度まとまった作業内容になっているなら、git stash branch を使って新しいブランチに切り出しましょう。

まとめ:git stashは正しく使えば強力な作業効率化ツール

git stash は、作業中の変更を一時的に退避させることで、タスクの切り替えや緊急対応をスムーズにしてくれる非常に便利なコマンドです。

本記事では、以下のようなポイントを解説しました。

  • よく使うコマンドのチートシート
  • git stash の基本的な使い方(push、apply、pop、list、drop など)
  • 実践的なユースケース(作業中断、複数タスク並行、緊急対応など)
  • 応用テクニック(一部変更のみを退避、ファイル単位での復元)
  • よくあるトラブルとその回避法

git stash は「ちょっとした保留」や「すぐ戻したい作業」を安全に管理できる、開発者にとっての心強い味方です。使い方をしっかり理解すれば、作業効率が大きく向上し、安心してブランチを切り替えたりタスクを並行したりできるようになります。

今後はぜひ、単なる「緊急退避」のためだけでなく、意図的に活用するツールとして git stash を使ってみてください。作業の柔軟性とスピードが格段に上がるはずです。

Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント