【Git】git stashで特定ファイルだけを一時保存する方法
こんにちは、とまだです。
みなさん、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}
pop
とapply
の違いは、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
オプションで更に細かい制御が可能pop
とapply
を使い分けて柔軟に復元
最初は基本的な使い方から始めて、徐々に高度な機能を使いこなしていけば大丈夫です。
特定のファイルだけをstashできるようになると、複数のタスクを効率的に進められるようになります。
ぜひ実際のプロジェクトで活用してみてください!
著者について

とまだ
フルスタックエンジニア
Learning Next の創設者。Ruby on Rails と React を中心に、プログラミング教育に情熱を注いでいます。初心者が楽しく学べる環境作りを目指しています。
著者の詳細を見る →