【Git】git stashで特定ファイルだけを一時保存する方法

git icon
Git

こんにちは、とまだです。

みなさん、Gitで作業していて「今の変更を一時的に保存して、別のブランチで作業したい」と思ったことはありませんか?

今回は現役のエンジニア、そして元プログラミングスクール講師としての経験から、git stashで特定のファイルだけを一時保存する方法について解説します。

git stashとは?

git stashは、作業中の変更を一時的に保存しておく機能です。

日常生活で例えると、冷蔵庫の野菜室みたいなものです。

料理の途中で急な来客があったとき、切りかけの野菜を野菜室に一時保管しますよね。あとで取り出して、また料理を続けられます。

git stashも同じです。

# 基本的な使い方
git stash  # 現在の変更をすべて退避

ただ、実際の開発では「すべての変更」ではなく、「特定のファイルだけ」を退避したいことがよくあります。

なぜ特定ファイルだけをstashしたいのか

実際の開発現場では、こんな状況がよくあります。

  • 機能Aを実装中に、緊急でバグBの修正が必要になった
  • でも、機能Aの一部は動作確認のために残しておきたい
  • バグBに関係するファイルだけを一時退避したい

このようなとき、すべての変更をstashしてしまうと、必要な変更まで消えてしまいます。

特定のファイルだけをstashできれば、柔軟な作業が可能になるのです。

特定ファイルをstashする基本的な方法

1つのファイルをstashする

特定のファイルだけをstashするには、git stash pushコマンドを使います。

# 特定のファイルをstashする
git stash push -m "一時保存:ヘッダーの修正" src/components/Header.tsx

-mオプションでメッセージを付けておくと、あとで何をstashしたか分かりやすくなります。

実際のプロジェクトでは、このメッセージがとても重要です。

複数のstashがある場合、メッセージがないと「どれが何の変更だったか」が分からなくなってしまいます。

複数のファイルをstashする

複数のファイルを同時にstashしたい場合は、ファイル名を並べて指定します。

# 複数ファイルをstashする
git stash push -m "APIクライアントの修正" -- api/client.js api/config.js

--を使うことで、オプションとファイル名を明確に区別できます。

これは特に、ファイル名が特殊な文字を含む場合に重要です。

パスパターンを使った指定

特定のディレクトリ内のファイルをまとめてstashすることもできます。

# 特定ディレクトリ内のファイルをstash
git stash push -m "コンポーネントの修正" src/components/

これで、src/components/ディレクトリ内のすべての変更がstashされます。

インタラクティブモードで細かく選択する

より細かい制御が必要な場合は、-p(patch)オプションを使用します。

git stash push -p

このコマンドを実行すると、変更箇所を1つずつ確認しながら、stashに含めるかどうかを選択できます。

各変更に対して以下の選択肢が表示されます:

  • y: この変更をstashに含める
  • n: この変更をstashに含めない
  • s: 変更を更に分割する
  • q: 終了

1つのファイル内でも、部分的にstashすることができるので、とても便利です。

stashした内容を確認・復元する

stashの一覧を確認

git stash list

このコマンドで、保存されているstashの一覧が表示されます。

stash@{0}: On main: 一時保存:ヘッダーの修正
stash@{1}: On feature/login: APIクライアントの修正
stash@{2}: WIP on develop: 9a3b2c1 Add user authentication

メッセージを付けておけば、どのstashが何の変更なのか一目で分かります。

stashの内容を確認

特定のstashの詳細を見たい場合:

# 最新のstashの内容を確認
git stash show -p

# 特定のstashの内容を確認
git stash show -p stash@{1}

stashを復元する

# 最新のstashを適用(stashは削除される)
git stash pop

# 最新のstashを適用(stashは残る)
git stash apply

# 特定のstashを適用
git stash apply stash@{1}

popapplyの違いは、stashを削除するかどうかです。

同じ変更を複数のブランチに適用したい場合は、applyを使うと便利です。

実務での活用例

ケース1:緊急のバグ修正

機能開発中に本番環境でバグが見つかった場合:

# 開発中のファイルを退避
git stash push -m "機能A:実装中" src/features/new-feature/

# バグ修正用ブランチに切り替え
git checkout -b hotfix/critical-bug

# バグ修正後、元のブランチに戻る
git checkout feature/new-feature

# 退避した変更を復元
git stash pop

ケース2:コードレビュー対応

レビューで指摘された箇所だけを修正したい場合:

# レビュー対象外のファイルを退避
git stash push -m "作業中:まだレビュー不要" src/components/Draft.tsx

# レビュー指摘箇所を修正してコミット
# ...修正作業...

# 退避したファイルを復元して作業継続
git stash pop

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

コンフリクトが発生した場合

stashを適用する際、現在の変更とコンフリクトすることがあります。

# コンフリクトが発生
git stash pop
# Auto-merging src/index.js
# CONFLICT (content): Merge conflict in src/index.js

この場合は、通常のマージコンフリクトと同じように解決します。

stashが適用できない場合

作業ディレクトリに未コミットの変更がある場合、stashの適用に失敗することがあります。

# 現在の変更を確認
git status

# 必要に応じて現在の変更もstash
git stash

# 目的のstashを適用
git stash apply stash@{1}

誤ってstashを削除してしまった場合

git stash dropで削除してしまっても、すぐなら復元できる可能性があります。

# 削除されたstashのハッシュを探す
git fsck --no-reflog | grep commit

# 見つかったハッシュから復元
git stash apply <ハッシュ値>

ただし、これは最後の手段です。

重要な変更は、こまめにコミットすることをおすすめします。

まとめ

git stashで特定のファイルを指定する方法は、実務では頻繁に使う重要なテクニックです。

主なポイントをまとめると:

  • git stash push <ファイル名> で特定ファイルをstash
  • -m オプションでメッセージを付けて管理しやすくする
  • -p オプションで更に細かい制御が可能
  • popapply を使い分けて柔軟に復元

最初は基本的な使い方から始めて、徐々に高度な機能を使いこなしていけば大丈夫です。

特定のファイルだけをstashできるようになると、複数のタスクを効率的に進められるようになります。

ぜひ実際のプロジェクトで活用してみてください!

共有:

著者について

とまだ

とまだ

フルスタックエンジニア

Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。

著者の詳細を見る →