前回の記事でgit graphを使ってブランチを切る方法をご紹介しましたが、その際、stashについても説明が必要だなーと感じたので、git graphでstashする方法についてご紹介していきます。
環境について
今回ご紹介する方法は下記の環境が必須?のものです。まだVSCodeを使ったことがない人、Git Graphを入れていない人はリンクからダウンロードしてください。
サクッと操作方法を解説
stashの操作方法は簡単で、git graphの画面を開き、未コミットの変更内容が表示されているところで右クリック→「Stash uncommitted changes…」をクリックするだけ。
stashする時にコメント(コミットする時と同じような)を入れることができますが、ここは特に入れなくもOK。
念の為GIF動画も貼っておきます。
stashした内容を元に戻すときは、stashしたコミットのところで右クリックをして「Apply Stash…」を押すだけで元に戻すことができます。
さて、そもそもstashとはなんぞや?って方のために
「stash」を直訳するためにGoogle先生に聞いたら「隠し場所」という意味らしい。gitのstashも意味通りの感じです。
stashを使うことで、未コミットの変更内容を一旦別の場所に保管(隠す)しておいて、後で作業に戻りたいときにApply stashをすれば未コミットの内容を元に戻して作業を再開することができるようになります。
どんな時にstashを使う必要が出てくる?
正直、使おうと思えばいつでも便利に使えそうな機能ですが、個人的に最も多いと感じるのは「ブランチの切り替えが必要な時」です。
複数人でも一人でも、ある程度のところまで開発が終わったら機能ごとにブランチを切って作業をすることが多いと思います。(一人作業で延々と長いブランチを使っている場合は、機能ごとにブランチを分けてみるといいかも)
すでに公開されているWEBサイトなどの場合、新しい機能を追加している間に「ここだけ今日中に修正して欲しいんだよね」なんて声がかかることも少なくありません。
その時に自分が他のブランチで作業中だった場合、未コミットの変更内容があるままブランチを移動してしまうと、その変更内容が移動先のブランチに共有されてしまいます。(#考えたくもない事態)
作業のキリのいい状態や、一人で管理しているブランチであればとりあえずコミットしてしまうのもOKですが、どうしてもコミットしたくないような場合に、stashしてからブランチを移動すれば未コミットの変更内容が共有されることがなく、安全に作業を進めることができます。
移動先のブランチでの作業が終われば、元のブランチに戻ってstashした内容を戻して作業再開できます。
git graphでブランチを切る方法については↓をどうぞ。
stashは複数作成することができる
stash自体は複数回行うことができ、それぞれのstashを個別に戻すこともできます。
そのため、ブランチを移動する時以外でも実験的な作業を試したい場合、ブランチは移動しないけど緊急で対応しなくてはいけない別の作業がある場合など、さまざまな場面で役立ちます。
コマンドを使ってstashを戻す場合git stash apply
、複数stashがあっても最新のものが戻ってきます。
git stash apply stash@{2}
のようにstashの番号をつけることで特定のstashをとってくることができるので覚えておくといいですね。
git graphを使ってstashを戻す場合は、戻したいstashのコミット部分で操作をすればいいので、より直感的な操作が可能です。
stash内容はローカルのみ。プッシュしてもリモートには送られない。
普通のコミットとの大きな違いはこれ。
stashした内容はローカル環境のみで使用されるので、他の作業をプッシュしてもstashの内容がリモートリポジトリに送られることはありません。
そのため、ちょっとした実験的な実装内容をいくつかstashして、数パターンで検証してから一つを選ぶ。というような時にもstashは役立ちます。
リモートにプッシュされないので複数stashしても他の人に影響がなく、検証していらなくなったstashも気兼ねなく削除することができます。
コミットだとリモートにプッシュした後は削除すると面倒なことになるので、削除せずにrevertなどで対応する必要があります。
まとめ
stashでもcommitでもどちらでもいい。なんてときはcommitしてしまった方がいいや。と思っていましたが、今回この記事を書きながらstashも捨てたもんじゃないな。と思いました。
特にリモートに送られない。という利点が大きく、今までは一旦ブランチを切り直していた小さな実験的な内容も、stashをうまく使えばもっとコンパクトに他の人への影響もなく、リモートリポジトリを汚さずにできるってことですね。
git。やっぱり奥が深い。