はじめに
Gitを用いたチーム開発において、「作業途中のコードがある状態で、別のブランチで発生した緊急の不具合対応(Hotfix)に切り替えなければならない」という状況は頻繁に発生します。
中途半端な状態のファイルを無理やりコミット(WIPコミットなど)してブランチを切り替えることも可能ですが、余計なコミット履歴を残したくない場合に有効なのが git stash です。
本記事では、作業中の変更を一時的に退避させる git stash について、新規追加ファイル(未追跡ファイル)の退避、スタッシュ内容の確認、個別ファイルの取り出しなど、一歩進んだ実用的なテクニックを解説します。
1. git stash の基本操作
まずは、最もよく使われる基本操作をおさらいしましょう。
# 現在の変更(ステージされている/されていない両方)を退避する
git stash
# 退避した作業リストの一覧を表示する
git stash list
# 直近に退避した作業(stash@{0})を復元し、かつリストから削除する
git stash pop
# リストから削除せずに、作業を復元するだけの場合
git stash apply
2. 実践で役立つ高度なスタッシュテクニック
① 新規作成したファイル(Untracked files)も一緒に退避する
デフォルトの git stash は、Gitの管理下にある(すでに一度コミットされたことがある)ファイルの変更しか退避しません。新しく作成したばかりの「未追跡ファイル(Untracked files)」は退避されずに残ってしまいます。
新しく作ったファイルも含めて一括で退避したい場合は、-u(--include-untracked) フラグを付与します。
# 新規作成ファイルもまとめて退避する
git stash -u
② スタッシュに名前(メッセージ)をつけて保存する
複数のスタッシュを保存していくと、git stash list を見たときに「どのスタッシュに何の作業が入っているか」が分からなくなります。
保存時にメッセージを添えることで、後からの見分けを容易にできます。
# メッセージ付きでスタッシュを保存する
git stash save "ログイン画面のUIコーディング途中"
# または (モダンなGitの場合)
git stash push -m "ログイン画面のUIコーディング途中"
③ 特定のスタッシュを削除またはすべてクリアする
不要になったスタッシュは個別に削除するか、一括クリアします。
# 特定のスタッシュを指定して削除する(例: リストの1番目を削除)
git stash drop stash@{1}
# すべてのスタッシュ履歴を完全に消去する(元には戻せないので注意)
git stash clear
3. スタッシュから一部のファイルだけを復元する
「スタッシュした作業の中にある、特定のファイル(例: config.json)だけを現在のブランチに取り戻したい」という場合、単純に pop してしまうとすべての変更が復元されてしまいます。
以下のコマンドを使うと、スタッシュの中から**特定のファイルのみを指定してチェックアウト(復元)**することができます。
# 特定のスタッシュ内の特定のファイルをチェックアウトする
git checkout stash@{0} -- path/to/file.js
これにより、他の変更はスタッシュ内に残したまま、必要なファイルだけを作業領域に戻すことができます。
まとめ
git stash は、ブランチの行き来が激しいマルチタスクな開発環境において、非常に便利な作業バッファとなります。
- 新規作成ファイルがある時は必ず
git stash -uを使う - スタッシュを作成する際は
-m "メッセージ"で後から識別可能にする - 部分的な復元には
git checkout stash@{X} -- <パス>を活用する
Gitの機能を正しく理解し、作業中のコードを失うことなく安全に並行開発を進めていきましょう。
