Featured image of post git stashを使いこなす:未追跡ファイルの退避から個別ファイルの復元まで Featured image of post git stashを使いこなす:未追跡ファイルの退避から個別ファイルの復元まで

git stashを使いこなす:未追跡ファイルの退避から個別ファイルの復元まで

git stashの高度な活用テクニックを徹底解説。未追跡ファイルの一時退避や部分的な変更の選択的保存、個別ファイルの復元、スタックの管理やブランチ間でのstash移動など、作業中の変更を安全に管理・復元する実践的なコマンド操作を紹介します。

はじめに

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 は、ブランチの行き来が激しいマルチタスクな開発環境において、非常に便利な作業バッファとなります。

  1. 新規作成ファイルがある時は必ず git stash -u を使う
  2. スタッシュを作成する際は -m "メッセージ" で後から識別可能にする
  3. 部分的な復元には git checkout stash@{X} -- <パス> を活用する

Gitの機能を正しく理解し、作業中のコードを失うことなく安全に並行開発を進めていきましょう。