git stash は、作業途中の変更をいったん退避して、ブランチ切り替えや緊急対応をしやすくするためのコマンドです。コミットするほどではないけれど、変更を失いたくないときにとても便利です。Git公式ドキュメントでも、変更を退避してあとで再適用できる仕組みとして説明されています。

この記事では、git stashの使い方を、退避・一覧・復元・削除の流れで整理します。apply と pop の違い、untracked file の扱い、戻す前の確認方法まで、初心者でも迷いにくい順番でまとめました。Git Bookの解説もあわせて見ると理解が安定します。

git stashは何をするコマンド?

未コミット変更を一時退避する仕組み

git stash は、作業中の変更をコミットせずに一時保存し、作業ツリーをきれいな状態に戻すコマンドです。今の作業を止めたいのに、変更をそのまま残したい場面で役に立ちます。たとえば、レビュー対応や緊急修正が入って別ブランチへ移動したいときに、途中経過を安全に避難させられます。

この「仮置き場」があることで、作業を中断しても再開しやすくなります。コミット履歴に残すほどではない変更を扱うときに、stash はかなり相性がいいです。

commitではなくstashを選ぶ理由

commit は履歴として残す保存、stash は一時退避です。まだ整理しきれていない変更を履歴に残したくない、でも作業は止めたい、というときは stash のほうが自然です。Git公式でも、clean な working directory に戻したいときの手段として案内されています。

つまり、commit は「保存して記録する」、stash は「一時的に置いておく」という役割分担です。迷ったら、あとで履歴に残したいかどうかを基準に考えると判断しやすくなります。

まずは基本コマンドを一気に整理する

git stash push / list / apply / pop / drop / clear

まず押さえたいのは、保存する、確認する、戻す、消す、の流れです。`git stash` は現在の変更を退避し、`git stash list` で一覧を確認し、`git stash apply` で戻し、`git stash drop` や `git stash clear` で整理します。`git stash` だけを指定した場合は `git stash push` と同じ扱いです。

git stash
git stash list
git stash apply
git stash pop
git stash drop
git stash clear

Qiitaの解説でも、まずはこの一連の流れを覚えるのが近道だとされています。コマンド単体より、用途の違いで覚えるほうが実戦向きです。

apply・pop・dropの違いを比較表で確認

コマンド 何をするか stashは残るか 向いている場面
git stash apply 退避した内容を戻す 残る あとで再利用する可能性があるとき
git stash pop 戻したあとに stash を削除する 残らない 一度戻したらもう使わないとき
git stash drop 指定した stash を削除する 残らない 不要になった退避を整理したいとき
git stash clear stash をすべて削除する 残らない stash を一括整理したいとき

apply は「戻すだけ」、pop は「戻して削除」、drop は「削除だけ」と覚えると混乱しにくくなります。Classmethodの記事Techmaniaの解説でも、この切り分けが実務でわかりやすいとされています。

退避するときに覚えておきたいオプション

-u と -a で対象ファイルを広げる

デフォルトの stash は、追跡中の変更とステージ済みの変更が主な対象です。`-u` を付けると untracked file も含められ、`-a` を使うと ignore 対象までまとめて退避できます。細かな一時ファイルが散らばっているときに便利です。

たとえば、生成途中のファイルや検証用の一時ファイルがある場合、`-u` や `-a` を知っているだけで作業切り替えの自由度がかなり上がります。

-m と –keep-index で運用を安定させる

`-m` を使うと stash にメッセージを付けられるので、`git stash list` を見たときに何を退避したか追いやすくなります。`–keep-index` は、ステージ済みの変更を残したまま他の変更だけを退避したいときに便利です。

あとで差し戻す予定の変更と、今すぐ別作業へ回したい変更を分けたいときは、この2つのオプションが効きます。小さな工夫ですが、後の自分がかなり助かります。

こんな場面で使うと便利

ブランチ切り替え前の一時退避

作業途中の変更がある状態で別ブランチへ移る必要が出たら、stash がいちばん素直です。中途半端な状態をコミットせずに残せるので、後から元の作業へ戻りやすくなります。

緊急修正やレビュー対応への切り替え

急な修正依頼やレビュー対応が入ったときも、stash なら今の変更を止めずに避難できます。作業を中断しても、あとで再開しやすいのが大きな利点です。

未完了作業を壊さず戻すコツ

stash を雑に pop すると、戻した直後に変更が混ざって見づらくなることがあります。迷うなら、まず list で棚卸しし、必要に応じて show や diff で中身を見てから戻す順番が安全です。

  • 退避前に「何を残したいか」を決める
  • 戻す前に `git stash show` で中身を確認する
  • 一度で消すなら pop、残すなら apply を使う

戻す前に失敗しないための確認ポイント

git stash show と git diff stash@{n} の使い分け

Git公式では、stash の中身は list だけでなく show でも確認できます。変更量が多いときは、`git diff stash@{0}` のように差分を見るほうが判断しやすい場合もあります。戻す前に中身を確認するだけで、誤適用のリスクはかなり下げられます。

git stash list
git stash show
git diff stash@{0}

conflict が起きたときの考え方

stash を戻したあとに conflict が出るのは珍しくありません。別ブランチで変更が進んでいたり、同じ行を別々に直していたりすると、apply や pop で衝突が起きます。その場合は、通常のマージ競合と同じように解消していけば問題ありません。

大事なのは、慌てて pop を連打しないことです。まず差分を確認して、どこがぶつかっているかを見極めると落ち着いて対処できます。

よくある質問

stash と commit の違いは?

commit は履歴として残す保存、stash は一時退避です。あとで整理して履歴に残したいなら commit、いったん作業だけ止めたいなら stash が向いています。

stash を消したあとに戻せる?

基本的には戻せません。だからこそ、`drop` や `clear` を使う前に、本当に不要かを list で確認しておくのが安全です。

untracked file は保存される?

標準の stash では保存されません。必要があるなら `-u` を使って含めるのが基本です。

迷ったときのおすすめ手順

最短で安全に使う流れ

まず `git stash list` で数を確認し、必要なら `git stash show` で中身を見て、最後に `git stash apply` で戻す。この順番にしておくと、初めてでもかなり安全です。使い切ると決めたときだけ `pop`、不要になった退避を消したいときだけ `drop` を使いましょう。

  1. 作業中の変更を確認する
  2. `git stash` で退避する
  3. `git stash list` で状態を確認する
  4. `git stash show` で中身を見る
  5. `git stash apply` か `git stash pop` で戻す

git stash は、作業を止めずに前へ進むための小さな避難所です。コマンドの意味がわかると、ブランチ切り替えや急な修正にも落ち着いて対応しやすくなります。次に覚えるなら、`git restore` や `git reset` との違いを押さえると、Gitの整理力がぐっと上がります。