[git] stash で作業中の変更を一時退避する

Tech

※ 本記事はアフィリエイト広告(Amazonアソシエイト)を含みます。

[git] stash で作業中の変更を一時退避する

「作業途中だけど、急いで別のブランチに切り替えたい」。でもコミットするほどでもない——そんなときは git stash で変更を一時退避できます。

退避する

現在の変更(ステージ済み・未ステージ)を退避して、作業ツリーをクリーンに戻します。

git stash

メッセージを付けておくと、後で何の退避か分かりやすい。

git stash push -m "ヘッダーの修正途中"

一覧と復元

退避したものはスタックで積まれます。

git stash list
# stash@{0}: On main: ヘッダーの修正途中
# stash@{1}: On main: ...

復元は pop(取り出して削除)か apply(取り出すが残す)。

git stash pop          # 最新を復元して、その stash を削除
git stash apply        # 復元するが stash は残す
git stash pop stash@{1}  # 番号指定で復元

よく使うやつ

新規ファイルも一緒に退避

git stash はデフォルトで未追跡ファイル(untracked)を退避しません。新規ファイルも含めたいときは -u

git stash -u

中身を確認する

git stash show -p stash@{0}   # 差分を表示

不要になったら捨てる

git stash drop stash@{0}   # 1つ削除
git stash clear            # 全部削除

ハマりどころ・メモ

  • 未追跡ファイルは -u を付けないと退避されない。新規ファイルが消えた?と焦る前に -u
  • pop は復元成功時に stash を消す。コンフリクトすると stash は残るので、解決後に手動で drop する。
  • 長期間ためた stash は「何だっけ」になりがち。メッセージ付き(-m)で退避しておくと後悔しない。
  • そもそも長く取っておくなら、stash より作業ブランチを切ってコミットした方が安全。

「ちょっとだけ退避して、すぐ戻す」用途にちょうど良い機能です。

git