git stashとは?変更を一時保存して作業効率を上げる方法

「この作業途中だけど、急ぎで別の対応が必要になった…」という場面に遭遇したことはありませんか。作業中のコードをどうにか退避させて、別のタスクに取り掛かりたい。そんなときに活躍するのが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}

popapplyの違いは、適用後に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 clear

git 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 pop

pullする前に変更を退避

リモートの変更を取り込みたいが、ローカルに未コミットの変更がある場合にもstashが活躍します。

git stash -m "pull前の一時退避"
git pull
git stash pop
# コンフリクトがあれば手動で解決

別ブランチに変更を移動

間違ったブランチで作業を始めてしまった場合、stashを使って正しいブランチに変更を移動できます。

# 現在のブランチでstash
git stash -m "別ブランチに移動する変更"

# 正しいブランチに切り替え
git checkout correct-branch

# stashを適用
git stash pop

stashからブランチを作成

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 pop

git stashとgit commitの使い分け

stashとcommitはどちらも変更を保存しますが、目的が異なります。

観点git stashgit commit
可視性ローカルのみ履歴の一部として共有可能
履歴一時的な保存場所永続的な履歴
用途短期的な変更退避意味のある変更の記録
リモートpushされないpushで共有可能

stashは「ちょっと横に置いておく」感覚で使い、commitは「意味のある単位で履歴に残す」ために使います。1週間以上保持するような変更であれば、WIPコミットとしてブランチに保存する方が安全です。

ベストプラクティス

説明メッセージを必ず付ける

stashには必ず-mオプションでメッセージを付けましょう。「あのstashは何だったっけ?」と悩む時間がなくなります。

# 良い例
git stash -m "WIP: ユーザー登録フォームのバリデーション実装中"

# 悪い例(メッセージなし)
git stash

stashは短期利用に限定する

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, 2stash@{n}の短縮形(一部コマンドで使用可)

まとめ

git stashは、作業の中断と再開をスムーズに行うための強力なツールです。緊急対応が必要になったとき、ブランチを切り替えたいとき、pullする前に変更を退避したいときなど、日常的な開発作業で頻繁に役立ちます。

効果的に活用するポイントは3つです。まず、必ずメッセージを付けて保存すること。次に、短期利用に限定して長期間放置しないこと。そして、定期的にstash一覧を確認してクリーンアップすることです。

これらを意識してstashを使いこなせば、作業の切り替えがストレスフリーになり、開発効率が向上します。

参考リンク

さらに深く学びたい方へ

この記事で紹介した技術をマスターするには、体系的な学習が重要です。独学で挫折しそうな方は、現役
エンジニアから直接学べるプログラミングスクールも検討してみてください。

現場で通用するスキルを身につけるなら

DMM WEBCAMPのカリキュラムは、実際の開発現場を想定したチーム開発も経験できます。ポートフォリオ制作
支援もあり、転職活動で差をつけられます。

未経験から4ヶ月でエンジニアとして活躍できるレベルまで成長可能です。

実務レベルのWeb開発スキルを習得するなら

RUNTEQは、1000時間の圧倒的学習量で、現場で即戦力となるWebエンジニアを育成します。Ruby on
Railsに特化し、実際のWebサービス開発を通じて実践力を養います。

卒業生の多くが自社開発企業への転職に成功している実績があります。

じっくり理解を深めたい方へ

この記事で紹介した内容を確実に身につけるには、分からない点をすぐに質問できる環境が重要です。CodeCa
mpなら、現役エンジニアとのマンツーマンレッスンで、あなたのペースで着実にスキルアップできます。

朝7時〜夜23時まで、365日受講可能なので、仕事や学業と両立しながら学習を進められます。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次