git stash を使用することで、まだコミットしたくない一時的な変更を git の中で退避しておくことができる.

作業を一時的に退避する

# コメント付き
$ git stash save "コメントメッセージ"

# コメント無し
$ git stash

これによって最新コミットの後に行われたワーキングツリーに対する変更が stash として退避され、 ワーキングツリーの状態が最新コミットの状態に戻ることとなる.

なお、 git stash は基本的に git add していない untracked なファイルに対しては退避されないようになっている. しかし、 -u あるいは --include-untracked オプションを付与することで untracked なファイルも一緒に退避させることができる.

# untrack ファイルも含めて退避する
$ git stash -u

一時的に退避した変更のリストを表示する

$ git stash list

一時的に退避した変更をワーキングツリーに再度反映する

# ワーキングツリーに反映し、stash 自体はそのまま保持しておく
$ git stash apply stash@{0}

# ワーキングツリーに反映し、元の stash は削除する.
$ git stash pop stash@{0}

なお、一度 stash として退避したファイル群の中で、 特定のファイルだけを取り出してワーキングツリーに反映したい 場合には以下のように git checkout を使用する. (https://dackdive.hateblo.jp/entry/2014/07/15/132855)

# git checkout stash@{番号} ファイル名

$ git checkout stash@{0} Dockerfile

一時的に退避した変更を削除する

$ git stash drop stash@{0}

退避した変更の詳細を確認する

$ git stash show stash@{0}

$ git stash show stash@{0} -p

tig 上での操作

tig では stash を作成するためのコマンドはデフォルトでは用意されていないので、 .tigrc に以下のようなキーバインドを登録すると良い.

# git stash (main ビュー)
bind main S ?git stash save "%(prompt Enter stash comment: )"

これにより、 main ビュー上で S キーを押すことで stash を tig 上で作成することができる.

また、stash の反映は y キーで stash ビューに切り替えた後 AP! キーで行うことができる.

A ?git stash apply %(stash)
P ?git stash pop %(stash)
! ?git stash drop %(stash)