Git

【git stash】コミットはせずに変更を退避したいとき

More than 1 year has passed since last update.

「とあるブランチで作業中だけど、いますぐやりたいことができた。

作業すごく中途半端だからコミットはしたくない。」

というときに、stashが使えます。

stashを使用すると、コミットしていない変更を退避することができます。

stashで変更を退避させて、今すぐやりたい作業をして、退避させていた変更を戻して作業を再開することができます。


変更を退避する

$git stash save

コミットしていない変更がある状態で上記のコマンドを実行すると、変更した部分が退避されます。

コミットしていない変更とは、addしたものもaddしていないものもどちらも含まれます。

ブランチは変更が取り消されたきれいな状態となります。

※saveは省略可能


退避した作業の一覧を見る

以下のコマンドで退避した作業の一覧を見ることができます。

$git stash list

// こんな感じで出力されます
stash@{0}: WIP on test: xxxx
stash@{1}: WIP on commit-sample: xxxx

stash@{X}がstashの名前で、WIP onのあとはブランチ名です。xxxxはstashをしたときのHEADのコミットハッシュとコミットメッセージになります。


退避した作業を戻す

// stash@{0}の作業をもとに戻します

$git stash apply stash@{0}

stash apply stash名にて退避した作業を元に戻すことができます。

このとき、現在チェックアウトしているブランチへ退避した変更が書かれます。

変更を退避したときのブランチにも、それ以外のブランチにも戻すことができます。

また、stash名を指定しない場合は、直近に退避された作業を戻します。

上記のコマンドだと、addしていた変更もaddされていない状態で戻ります(stagedされていた変更もnot stagedととして戻る)。

addした状態そのままにもどしたいときは、上記のコマンドに--indexオプションを付けて実行します。

$git stash apply stash@{0} --index


退避した作業を消す

stashを使用して退避した作業を元に戻しても、退避した作業はそのまま残ります。

stash listを行うとそのまま残っているはずです。

退避した作業を消すには、以下のコマンドを使用します。

// stash@{0}を削除します

$git stash drop stash@{0}


退避した作業を元に戻すと同時に、stashのリストから消す

退避した作業を消すにはdropを使用する必要がありましたが、作業をもとに戻すと同時に消すこともできます。

// stash@{0}の作業をもとに戻すと同時に、退避作業の中から削除します

$git stash pop stash@{0}

退避した変更をもとに戻す際にコンフリクトが発生する場合などもあるので、消すのは同時にしなくてもよいかもしれません。


そのほか


作業を退避するときにメッセージを付ける

$git stash save "stash message"

$git stash list
stash@{0}: On test: stash message

コミットハッシュ+コミットメッセージが表示されていた部分が、指定したメッセージになっています。


退避した変更の詳細をみる

$git stash show stash@{0}

変更ファイルの一覧を見ることができます。

また、-pオプションをつけることで、変更内容の詳細をみることもできます。

$git stash show stash@{0} -p


新規追加したファイルも退避させる

新規に追加したファイルをAddしていない状態で退避させるには-u(もしくは--include-untracked)オプションを使用します。

(すでにaddしている場合にはオプションなしで退避できます)

$git stash -u


addした変更以外を退避させる

オプションを何もつけない場合、addした変更もaddしていない変更も退避されます(新規追加ファイルは例外)。

-k(もしくは--keep-index)をつけて実行すると、addした変更は退避されません。

$git stash -k


退避した作業をすべて消す

$git stash clear

stash listで表示されていた退避した作業がすべて消えます。