Site icon Tips Note by TAM

git stash で、作業中の変更をいったん横に退けておく

git には、作業途中の変更をいったん横に退けておける git stash という便利な機能があります。この git stash 機能について、コマンドラインと SourceTree での操作方法を紹介します。

どんなときに便利なの

1. 割り込み作業が発生したとき

なにかの作業中、急ぎで別のブランチを操作したり、サーバから pull しなきゃいけない割り込み作業が発生したりします。やりかけている変更がコミットできる状態なら、コミットしてブランチ移動なり pull なりすれば良いのですが、

  • まだ中途半端な状態なので、コミットはしたくない。
  • でも今の修正内容は捨てたくない。一時的に取っておいて、あとで戻してきたい。

そんなときに git stagh が便利です。git stash を使えば、

  1. 途中状態の変更を、stash 機能で横に退ける
  2. 作業ディレクトリは、きれいな(変更のない)状態になる
  3. ブランチ移動なり pull なり、割り込み作業をすませる
  4. (1) で退けておいた変更を元に戻してくる

こんな手順で、途中状態の変更をコミットせずに、割り込み作業を行えます。

2. ブランチを間違えて作業開始してしまったとき

ほんとは feature ブランチで作業しないといけないのに、間違って master ブランチで変更を行ってしまった! まだコミットはしていないものの、いろいろ変更してしまったのでこの作業はどうしたらいいものか……
という時にも使えます。

  1. 途中の変更を、stash 機能で横に避ける
  2. ブランチを本来のコミット先の feature に移動する
  3. (1) で避けておいた変更を戻してくる (feature ブランチに適用する)

これで無事にリカバリ完了です。stash 機能は、変更の差分だけを退避してくれるので、内容を別のブランチに適用することができます。

つかいかた

コマンドラインから使う

コマンドラインだとこんな感じです。コミット前の変更がある状態で以下を入力すると、

git stash

コミット前の変更内容が、stashコマンドによって一時的に退避されます。

退避されていることを確認するには、

git stash list

これで退避されている内容がリスト表示されます。

退避した内容を元に戻してきたいときは、以下のどちらかのコマンドを使います。(退避した情報を消すか残すか、の違いです)

# 最新の退避内容を復元し、退避したデータは消す
git stash pop

# 最新の退避内容を復元し、退避したデータを残す
git stash apply

SourceTree から使う

ツールバーに「スタッシュ」ボタンがありますので、それを押すだけの簡単操作です。

gitstash01

退避内容はサイドバーの「一時退避」から確認できます。

復元するにはサイドバーの項目の右クリックメニューもしくはダブルクリックで。

新規ファイルも退避したいときは

git stash コマンドは、デフォルトでは git 管理しているファイルのみが退避されます。新規に追加したコミット前のファイルがあっても、それは stash の対象になりません。

コマンドラインでは、-u オプションをつけることで新規ファイルも stash の対象にできます。

git stash -u

SourceTree では、新規ファイルをいったん Index にステージした状態にして「スタッシュ」ボタンを押すことで、stash 可能となります。

参考