【Git】 stashを使って変更を一時的に退避する

スタッシュを用いることで、変更を一時的に退避できます。

作業が中途半端でコミット履歴に残したくないけど他のブランチの作業に入りたい、作業していたブランチを間違えていたので変更を別ブランチに移したい、などの時に役立ちます。

stashの流れ

大まかな流れは

  1. ブランチAでファイルを適当に変更する
  2. スタッシュを実行
  3. ブランチBで作業してコミットなどなど
  4. ブランチAに戻る
  5. スタッシュを適用

これで、コミットせずにブランチ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に入れた変更は、別のブランチにも適用できるということです。

手順は、

  1. 間違えているブランチで作業
  2. その変更をコミットせずにstashに入れる
  3. 正しいブランチに移動
  4. 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適用とするとうまく移行できます。

stash thumb

役に立ったらシェアしよう!