作業中のコードをコミットせずに一時的に退避させたい…
そんなときに活躍するのがgit stashコマンドです。
Git を使った開発では、「今の作業を中断して、急ぎのバグ修正に対応したい」「複数のタスクを並行して進めたい」など、状況に応じて柔軟に作業を切り替える必要が出てきます。git stash は、現在の作業状態を一時保存し、あとから元に戻せる便利なツールです。
この記事では、Git 初心者にもわかりやすく git stash の基本的な使い方から、応用テクニック、トラブル対応、さらにはベストプラクティスまでを網羅的に解説します。
作業効率を高めたい方や、git stashをなんとなく使っていた方にも、確かな理解と活用のヒントをお届けします。
はじめに:git stashって何?
git stash は、作業中の変更を一時的に保存して作業ディレクトリをクリーンな状態に戻すための Git のコマンドです。現在の変更をコミットせずに退避させることで、別のブランチでの作業や緊急対応などにスムーズに移行できるようになります。
たとえば、新しい機能を開発している途中に、緊急のバグ修正を行う必要が生じたとします。このとき、作業中の変更をそのままにしてブランチを切り替えると、競合が発生したり、未コミットの変更が混在したりして作業が煩雑になります。こうした場面で git stash を使えば、現在の作業状態を一時的に退避させておき、修正作業が終わった後に元の状態へスムーズに復元することができます。
stash された変更はスタック(積み重ね)構造で管理されており、複数の作業状態を順に退避・復元することも可能です。また、退避する際にメモをつけたり、未追跡ファイルも含めたりといった柔軟な操作もできます。
Git を使った日々の開発作業において、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} のように番号が割り振られ、スタックとして管理されています。
退避した変更を復元する
stash した内容を再び作業ディレクトリに適用するには apply か pop を使います。
git stash apply stash@{0}
このコマンドは内容を復元しますが、stash 自体は削除されません。
一方で、以下のように pop を使うと、適用と同時に stash のスタックからも削除されます。
git stash pop stash@{0}
作業を終えたあとに不要になった 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 を使えば、作業中の状態を保存しておいて別のブランチに切り替えることができます。
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 pop や apply を使って変更を戻すことで、作業の混在やミスを防げます。
作業を一時的に保留したいとき
「ちょっと席を外す」「会議に呼ばれた」「一旦別のことをやらなきゃ」など、開発中に一時中断せざるを得ないシーンもよくあります。そんなとき、ステージングせずに手軽に保存できる git stash は非常に便利です。
特に、まだコミットするほどまとまっていない変更でも、気軽に退避できるのが魅力です。
git stash push -m "途中経過"
変更を失う心配なく中断できることで、安心して作業に戻ることができます。
このように、git stash は緊急時だけでなく、日常のちょっとした切り替えや保留にも役立ちます。
応用テクニック:部分的なstashやファイル単位復元
基本的な git stash の使い方をマスターしたら、さらに細かく柔軟に操作できる応用テクニックも覚えておくと便利です。ここでは、特定ファイルだけを stash に含めたり、部分的に復元したりする方法を紹介します。
インタラクティブに変更を選んでstashする(--patch)
すべての変更を一括で stash するのではなく、「この変更はstashしたいけど、これは残しておきたい」といった細かい制御が必要なこともあります。そんなときに使えるのが --patch オプションです。
git stash push -p
このコマンドを実行すると、変更内容ごとに「stash するかどうか」を確認するプロンプトが表示されます。
Stage this hunk [y,n,q,a,d,s,e,?]?
y: この変更をstashするn: この変更はstashしないa: 以降すべてstashするd: 以降すべてstashしない
細かく内容を見ながら選択できるため、作業中の変更を安全に整理することができます。
未追跡ファイルもstashする(-u / --include-untracked)
デフォルトでは、git stash は未追跡ファイル(git add していない新規ファイル)を含めません。これらも一緒に退避したい場合は、以下のように -u オプションを使います。
git stash push -u
さらに、.gitignore によって無視されているファイルも含めて stash したい場合は、-a(--all)を使います。
git stash push -a
ただし、無視されているファイルを退避するのは稀なケースなので、使用には注意が必要です。
特定ファイルだけ復元する(Git 2.23以降)
stash された変更のうち、特定のファイルだけを元に戻したい場合には git restore コマンドを使うと便利です(Git 2.23 以降)。
git restore -s stash@{0} -- path/to/file
この方法では、stash の中にある指定ファイルだけを選んで復元できるため、大きな変更の一部だけを戻したいときに重宝します。
こうした応用テクニックを活用すれば、git stash は単なる一時退避ツールにとどまらず、変更管理の強力な味方になります。
スタッシュの中身を確認する方法
git stash で変更を一時退避したあと、「どんな変更だったっけ?」と確認したくなることはよくあります。スタッシュは見えないところに保存されているように感じるかもしれませんが、実際には中身をしっかり確認できます。ここでは、スタッシュの中身を確認するための基本的なコマンドを紹介します。
stash 一覧を確認する(git stash list)
まず、現在スタックされているスタッシュの一覧を確認するには、以下のコマンドを使います。
git stash list
出力例:
stash@{0}: On main: 機能Aの途中作業
stash@{1}: On main: バグ修正の前作業
このように、スタッシュには番号が振られており、後述する各種コマンドで stash@{n} という形式で指定します。
差分を確認する(git stash show)
スタッシュの中でどのファイルが変更されたか、ざっくり確認したい場合は git stash show を使います。
git stash show stash@{0}
出力例:
main.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
これはファイルごとの変更量を表示してくれる簡易的な概要です。
内容を詳細に確認する(-p オプション)
変更の具体的な内容(パッチ)まで確認したい場合は、-p オプションを追加します。
git stash show -p stash@{0}
これで、git diff と同様の形式で変更内容の全文が確認できます。コードのどこがどう変わったかを、正確に把握したいときに便利です。
git diff との組み合わせで柔軟に確認
より柔軟に差分を確認したいときには git diff コマンドを直接使う方法もあります。
git diff stash@{0}
これは、スタッシュの内容を現状と比較するのではなく、「スタッシュそのものがどんな変更を持っているか」を確認するために使えます。
スタッシュの中身を把握しておくことは、誤操作を防ぐだけでなく、安心して作業を切り替えるためにも重要です。
トラブルシューティングと注意点
git stash は便利な機能ですが、使い方を誤ると意図しない結果を招くこともあります。このセクションでは、よくあるトラブルとその対処法、そして使用時に注意すべきポイントを紹介します。
スタッシュを適用したらコンフリクト(競合)が起きた
git stash apply や pop を実行した際、スタッシュ内の変更と現在の作業ディレクトリの内容に差異があると、競合(コンフリクト)が発生することがあります。
対処法:
- コンフリクトのあったファイルを確認(Gitが自動でマーキング)
- 手動で修正し、
git addでステージング - 必要に応じて
git commitで確定
コンフリクトは通常のマージ作業と同じ流れで解消できます。
git stash pop のあとに内容が消えた
git stash pop は適用後にスタッシュを削除します。もし適用に失敗したり、競合中に操作を誤ると、変更内容が失われる可能性があります。
安全策:
- 内容を残しておきたいときは、
applyを使って、適用後に手動でdropする方が安全です。
git stash apply stash@{0}
# 問題なければ
git stash drop stash@{0}
間違って stash drop や clear を実行してしまった
drop や clear を実行すると、スタッシュは即座に削除され、基本的には元に戻せません。ただし、Gitの内部履歴を使って一部の情報を取り戻せる可能性があります。
対処法(上級者向け):
git fsck --lost-found
や、
git reflog
を使って、該当するオブジェクトハッシュを探し、そこから手動で内容を復元することができる場合があります。ただし、確実な方法ではなく、事前のバックアップや注意深い運用が推奨されます。
stash が増えすぎて管理しづらい
git stash list を確認すると、過去の作業が大量に残っていて、どれが必要か分からなくなることがあります。
対処法:
push -mでメモを残す習慣をつける- 古いスタッシュを定期的に
dropかclearで整理する - 必要な内容はなるべく早めに
applyしてブランチにコミットしておく
トラブルを未然に防ぐためにも、git stash の操作は「安全第一」で進めることが大切です。
git stashを使う際のベストプラクティス
git stash は便利な一時退避ツールですが、使い方を誤ると混乱やトラブルの原因になります。ここでは、日常的な開発作業の中で git stash を安全かつ効果的に使うためのベストプラクティスを紹介します。
1. スタッシュには必ずメモをつける
スタッシュを多用していると、「この stash@{2} って何だっけ?」という状況になりがちです。内容を思い出せずに取り扱いを誤ることもあります。
git stash push -m "ログイン画面の調整"
このように -m オプションでメモを残すことで、git stash list を見たときに何の作業を退避したのか一目でわかるようになります。
2. 一時的な用途にとどめる
スタッシュは本来、短期的に作業を切り替えるための一時保管が目的です。長期間そのままにしておくと存在を忘れたり、作業の文脈が不明瞭になってしまいます。
- ✕ 悪い例:1週間以上前の stash が複数残っている
- 〇 良い例:当日または翌日中に pop または drop して整理
中長期の作業管理は、ブランチ運用やコミットに切り替えるのが安全です。
3. 未追跡ファイルを含めるかどうか意識する
未追跡ファイル(git add していないファイル)は、デフォルトでは stash に含まれません。必要に応じて -u(--include-untracked)を使いましょう。
git stash push -u -m "作業+新規ファイルも退避"
ただし、.gitignore に設定された無視ファイルまで含める -a(--all)の使用は、特別な理由がない限り避けるべきです。
4. applyとpopの違いを理解して使い分ける
git stash apply: 内容を復元するが、スタッシュは削除されないgit stash pop: 内容を復元し、スタッシュからも削除される
復元後の内容を残しておきたい場合は apply を使い、不要になったら手動で drop するのが安全です。
git stash apply stash@{0}
# 問題なければ
git stash drop stash@{0}
5. ブランチを分けた方が良い場合は早めに切り替える
ある程度まとまった作業内容になっているなら、stash ではなくブランチを作って管理した方が後々の対応もスムーズになります。
git stash branch new-feature stash@{0}
このコマンドを使えば、スタッシュした内容を新しいブランチに適用し、そのまま作業を続けられます。
ベストプラクティスを意識して使うことで、git stash は「なんとなく便利」から「確実に使える」ツールへと変わります。
まとめ:git stashは正しく使えば強力な作業効率化ツール
git stash は、作業中の変更を一時的に退避させることで、タスクの切り替えや緊急対応をスムーズにしてくれる非常に便利なコマンドです。ただし、使い方を誤ると競合や変更内容の消失といったトラブルにつながることもあります。
本記事では、以下のようなポイントを解説しました。
- git stashの基本的な使い方(push、apply、pop、list、drop など)
- 実践的なユースケース(作業中断、複数タスク並行、緊急対応など)
- 応用テクニック(一部変更のみを退避、ファイル単位での復元)
- 中身の確認方法(
stash show -pやgit diffとの組み合わせ) - よくあるトラブルとその回避法
- 安全で効果的な使い方のベストプラクティス
git stash は「ちょっとした保留」や「すぐ戻したい作業」を安全に管理できる、開発者にとっての心強い味方です。使い方をしっかり理解すれば、作業効率が大きく向上し、安心してブランチを切り替えたりタスクを並行したりできるようになります。
今後はぜひ、単なる「緊急退避」のためだけでなく、意図的に活用するツールとして git stash を使ってみてください。作業の柔軟性とスピードが格段に上がるはずです。

コメント