【Git】 stashを使って変更を一時的に退避する
スタッシュを用いることで、変更を一時的に退避できます。
作業が中途半端でコミット履歴に残したくないけど他のブランチの作業に入りたい、作業していたブランチを間違えていたので変更を別ブランチに移したい、などの時に役立ちます。
stashの流れ
大まかな流れは
- ブランチAでファイルを適当に変更する
- スタッシュを実行
- ブランチBで作業してコミットなどなど
- ブランチAに戻る
- スタッシュを適用
これで、コミットせずにブランチAの変更を維持することができます。
早速stashを使いますが、stashは主にブランチを跨ぐ場合に利用するため、まずはブランチを作成しましょう。もちろんGUI操作でも問題ありません。
# masterブランチに適当にコミット echo "abcde" > hoge.txt git add . git commit -m "initial commit" # ブランチ作成 git branch test1 git branch test2 # ブランチ切り替え git checkout test1
Terminalから操作時、文字コードがUTF16LE
になるとうまく行かない場合があるので、IDEから編集したほうが確実です。
変更を一時的に退避
まずはtest1ブランチで適当にファイルを変更します、何でも良いです。今回は例としてhoge.txt
に下のような内容を書き込みます。
abcde 12345
次に、この変更をスタッシュに入れてみます。
# stashの作成 git stash save <コメント> -u
このstash@{0}
がstash名です。On test1
はブランチ名ですね。
-u
は--include-untracked
の略で、その時点で追跡対象に含んでいないファイルも対象となります。(つまり新規作成ファイルも退避)
git stash -u save コメント
だとエラーとなるため、順序に注意が必要です。
単にgit stash
としても動作しますが、コメントをつけるほうがわかりやすいため、つけることを推奨します。
この時点で、stashのリストはこのような表示になると思います。
> git stash list stash@{0}: On test1: sample_stash
これで変更の退避が完了しました。編集したファイルが元に戻っていると思います。
次にブランチを切り替えて適当に作業してcommitしましょう。
# ブランチ切り替え git checkout test2 # 適当にファイルの編集などをしたらcommit git commit -a -m "test2 commit"
stashから変更を復元する
コミットしたら、元のtest1ブランチに戻ってstashを復元してみます。
# ブランチ切り替え git checkout test1 # スタッシュ一覧を表示 git stash list # 反映したいスタッシュを選択して実行 git stash apply stash@{0}
これでstashした変更を適用できました。git stash apply
とだけした場合は、最後のstashが反映されます。
stashを反映したら、整理のために元あったstashは消しておくのを推奨します。
# 指定したstashを削除する場合 git stash drop <スタッシュ名> # stashをすべて削除する場合 git stash clear
作業中の変更を他ブランチに移す
開発でよくあるのが、作業ブランチを間違えたので、コミットしていない変更を他ブランチに移したいというものです。何もせずにそのまま切り替えられれば良いですが、編集していたファイルがブランチ間で異なる場合は、そのままでは変更が引き継げない場合があります。
この場合もstashが役に立ちます。stashに入れた変更は、別のブランチにも適用できるということです。
手順は、
- 間違えているブランチで作業
- その変更をコミットせずにstashに入れる
- 正しいブランチに移動
- stash適用
となります。もしコミット済みだった場合は、コミットを戻してからになります。
もしコンフリクトする場合は、ブランチをマージしたときと同様の方法でコンフリクトを解消します。
コマンドまとめ
# stashを作成 git stash save コメント -u # stash一覧を表示 git stash list # stashを反映 git stash apply スタッシュ名 # 最後のstashを反映 git stash apply # 特定のstashを削除 git stash drop スタッシュ名 # stashをすべて削除 git stash clear
まとめ
ブランチを切り替える際は、基本的にコミットできるようなキリが良いタイミングが多いと思いますが、こうしたい場合も時々あります。
また、作業ブランチを間違えるのもよくあることです。プッシュ前であればファイルをそのままにコミット位置を戻してstashに入れ、別ブランチでstash適用とするとうまく移行できます。
