In a nutshell
git stash
は、作業中の変更を一時的に退避し、作業ディレクトリをクリーンに保つ Git のコマンドである.コミットせずに中断できるため、他の作業やブランチへの切り替えがスムーズに行える.短期間で戻る予定のある作業には特に有効.
はじめに
git stash を使えば,作業中の変更を一時的に保存し,安全に他の作業へ移ることができる.本記事では,初学者向けに git stash の基本的な使い方と注意点,実務での利用例を紹介する.
予想される読み手
- Git について,初学者である
-
git stash
についてあまり分かっていない - Git を今後も利用する必要がある
git stash とは
作業中の変更を一時的に退避(保存)して,作業ツリーをクリーンな状態に戻すためのコマンド.例えば, branch を切り替える必要があるが,現在の作業を commit したくないときに用いる.よって,作業中のコードを commit せずに一時的に退避させたいときに便利.例えば,別のタスクが割りこんだり,バグ修正のために他の branch へ移動しなければならない場合,今の作業を中断して退避できる.
実務でのシチュエーション
- レビュー対応のために別の branch にすぐ切り替えたい
- ビルドやテストに失敗して,一旦原因を切り分けたい
- 作業 branch で中断したコードを一時的に退避し,他のタスクに集中したい
- 複数の作業を並行して行う必要があるとき
使いどころの判断
stash
は,短期間だけ作業を中断し,すぐに戻る予定がある場合に適している.逆に,作業が長引きそうであれば,ブランチを分けた方が安全・明確である.
基本的な使い方
作業内容を退避する
git stash
作業中の変更(ステージ済みと未ステージの両方)が退避され,作業ディレクトリが初期状態に戻る.
stash の一覧を表示
git stash list
退避した作業を戻す(最新のもの)
git stash apply
退避した作業を戻して削除
git stash pop
特定の stash を戻す
git stash apply stash@{1}
stash@{0}
は一番新しい stash
を指す.git stash list
で一覧を確認すると対応関係がわかる.
stash を削除する
git stash drop stash@{0}
すべての stash を削除
git stash clear
管理外のファイルも退避する
git stash -u
stash の中身を確認する
git stash show
git stash show -p
-
git stash show
:変更ファイル一覧 -
-p
をつけると差分(patch)を表示
利点と欠点
利点
- すぐに作業を切り替えられる
- 作業の途中で commit 履歴を汚さずに済む
- 安全に作業を一時退避できる
欠点
- stash したまま忘れてしまうことがある
- 複数の stash があると管理が煩雑になる
- 一部の変更だけを選んで stash するのがやや面倒
代替案
-
WIP(Work In Progress) commit を作成する
- 一時的にローカルで commit して,後で修正・削除する
- ** branch を切って作業を避難させる**
- 一時的な branch を作成して退避することで,より明確に状態を保存できる
-
git worktree を使って別の作業ツリーを作る
- stash に頼らず複数の作業状態を同時に扱うことができる
備考
stash
の内容は Git 内部に保存されるが,永続的ではない
-
stash
は永続的な保存手段ではなく,意図せず削除されることもあるため,重要な作業はコミット or ブランチ分岐で保存すべき.
stash
はステージ済みの内容も含めて退避する
-
git add
した内容もstash
に含まれるため,退避後は作業ツリーが完全にクリーンな状態になる.
stash
適用時の競合に注意
-
git stash apply
やpop
の際,作業ツリーと衝突があると競合(コンフリクト)が発生する. - この場合,通常のマージ同様に手動で解決が必要.
stash
に名前(メッセージ)を付けることはできない
-
git stash
自体には名前を直接つけるオプションはなく,自動でコメントが付与される. - バージョンによっては
git stash save "メッセージ"
が使えるが,現在のバージョンでは非推奨.git stash push
を使う事が推奨される.
GUI クライアントでは stash
の操作がより視覚的にできる
- Sourcetree や GitKraken など一部 GUI ツールでは,
stash
の一覧・適用・削除を視覚的に管理可能. - CLI が苦手な人にも使いやすい.
他人と共有する用途には向かない
-
stash
はローカルな操作であり,リモートへは push できない. - 他人と作業状態を共有するには,コミットやブランチのほうが安全.
Summary
-
git stash
は作業中の変更を一時保存するコマンド - ステージ済み・未ステージの変更をまとめて退避可能
-
apply
とpop
の使い分けに注意(pop
は削除も行う) - 忘れやすく、管理が煩雑になる点に注意が必要
- 永続保存や共有にはブランチ・WIPコミットが有効
- GUIツールでも stash 操作は可能で初心者にも扱いやすい