git stashを使ってコミットせずにブランチを変更

2023/11/02に公開

git stashを使う理由

Gitを使用する際、コミットしていない状態でmaster > branch移動はできますが、branch > branch > masterでは移動できず、Git使用に慣れていないときびしくなります。
例えば、「とあるブランチで作業中だけど、いますぐやりたいことができた。作業がすごく中途半端だからコミットはしたくない。」というときに、stashが使えます。

git stashとは

gitstashとは、ワーキングディレクトリで修正したファイルを保存するコマンドです。 stashは、modifiedでありながらtracked状態のファイルとstagingareaにあるファイルをスタックにしばらく保存し、後で再び保存できるようにしてくれます。まだ終わっていない作業をしばらく保存しておいて、他のブランチで作業をして、また戻ってきて保存しておいた作業を終えられるようにしてくれます。

git stash

untrackedを除くすべての作業履歴ファイルを一時保存しておいて作業内訳を空けます。

$ git stash

git stash -u

untrackedまで含めてstashする

$ git stash -u

git stash --staged

stagedされたファイルだけをstashします。
現在の修正内容を他のコミットに移す際にすかいます。
(移動内訳をコミットしてcherry-pickを使う方式を使っても良いが、 余計なコミットを作らなくてもいいのでもっと楽だと思います。)

$ git stash -staged

git stash list

stashリストを確認します。

$ git stash list
stash@{0}: WIP on practice: xxxx
stash@{1}: WIP on commit-: xxxx

stash@{番号}:コミットHash "コミットメッセージ"
ここで、中括弧に表記された番号を以下に紹介されるコマンドの後に追加すると、作業するstashを指定することができます。
ex: git stash pop 2 == stash@{2}をpopします。
git stash show -p 3 == stash@{3}のファイル修正内容を照会します。

git stash apply

直近にのstash@{0}の作業をもとに戻します。listから消されないです。

$ git stash apply

git stash pop

直近にのstash@{0}の作業をもとに戻って、listから消されます。

$ git stash pop

git stash drop

直近のstashを削除します。(削除したとしてもハッシュ値を利用して復旧できます。)

$ git stash drop

git stash show -p

直近stashのファイル変更内訳を詳しく見せてくれます。(どのラインに何を追加して..など)

$ git stash show -p

Discussion