Engineering git

git入門:git stashの使い方 - 変更を一時的に退避させる方法

git stashというコマンドをご存じでしょうか?書籍などで体系的にgitを学んだ方にとっては常識かもしれないですが、業務の中で実践的に学んだ方にとってはあまり馴染みのないコマンドかもしれません。そこで今日はgit stashについて解説をしたいと思います。

git stashとは?

git stashとは、現在の変更内容を一時的に退避させるコマンドです。この変更を退避させるというのが非常に便利で、コミットせずとも自分が行った変更を保持して、別の作業を行うことができるようになります。

ユースケース

git stashは一時的に変更内容をコミットせずに退避させることができます。これは現状行った変更が中途半端で、まだコミットしたくないけど、作業ブランチを切り替える必要が出てきた際に、効果を発揮するコマンドです。具体的には以下のようなケースが発生した場合、ブランチを切り替えることがあるかと思います。

  • 緊急のhotfix, bugfixの対応で、別ブランチで作業を行う必要が出たとき
  • PR/MRレビューを手元のエディタ上で行うために、マージ元のブランチにcheckoutするとき
  • masterの変更を取り込むためにブランチを切り替えて、最新のコードをpullしたいが、変更がコンフリクトしてcheckout/pullできないとき

こういったときにgit stashが活躍します。また少し異なった使い方にはなりますが、現状加えた変更を戻して、クリーンな状態に復元したい時にも、1コマンドで変更を加えたものをすべて退避させることができ、ブランチをクリーンな状態にロールバックすることができます。

使い方

それではさっそくgit stashの使い方を見てみましょう。基本的には変更を退避させる、退避させた変更を適用する、の2つがあります。

変更を退避させる

リポジトリ全体や、ファイル単位まで、いろいろな退避の方法があります。以下のコマンドのいづれかを実行することで、変更がスタックされます。

# リポジトリ全体の変更を退避させる(trackされているファイルのみ)
git stash

# リポジトリ全体の変更を退避させる(untrackなファイルも含む)
git stash -u

# 特定のファイルの変更のみ退避させる
git stash push -- hoge.py

# 複数のファイルの変更を退避させる
git stash push -- hoge.py hogehoge.py

変更を適用する

git stashで退避させた変更は以下のコマンドで適用できます

# 最新の退避させた変更を適用する
git stash apply

# 最新の退避させた変更を適用し、退避させた内容は削除する
git stash pop

# 指定の退避させた変更を適用する
# index numberはgit stash listで確認可能
git stash apply stash@{index number}

# 指定の退避させた変更を適用し、退避させた内容は削除する
# index numberはgit stash listで確認可能
git stash pop stash@{index number}

その他のよく使うコマンド

git stashでは以下のようなコマンドもよく使います。git stashでは明示的に退避した変更を削除しないと、スタックにたまり続けていきますので、dropclearなどでたまにスタックを整理するとよいかと思います。

# 退避させた変更内容の表示
git stash list
stash@{0}: hogehoge...
stash@{1}: hogehoge...

# 退避させた変更内容の先頭を削除
git stash drop

# 退避させた特定の変更内容を削除
git stash drop stash@{index number}

# すべての退避させた変更内容の削除
git stash clear

まとめ

git stashについて簡単にではありますが紹介しました。開発をチームで行っているとほかの人の変更を取り込んだり、レビューを行ったりと、ブランチを切り替える機会も多く、そのたびに活躍するコマンドです。実は私はこのコマンドを知るまでは、変更を行っていたファイルをいったんコミットしてgit resetしたり、ファイル自体を別名コピーして一時的に保存したりと、とても非効率なことを行っていました。git stashを知らずに同じようなことをやっている方の作業効率が、少しでも良くなれば幸いです。

-Engineering, git
-,