開発を行っていると、それまで行っていた作業内容よりも先に解決しなければいけない要件が飛び込んでくることはざらにあります。
Gitでプロジェクトを管理している場合、基本的には作業内容ごとにブランチを切り分けていきますが、未コミットの状態があるとブランチの切り替えを行うことができません。
ですが、状況によっては修正内容をまだコミットしたくない・・・という場合もあります。
こういったケースなどで役に立つのが、git stashコマンドです。
今回は、git stashコマンドを使って変更内容を一時的に退避させる方法について解説していきたいと思います。
git stashとは?
git stashコマンドは、 未コミットの変更内容を一時的に退避させ、作業ブランチの状態を元に戻すコマンドです。
「修正内容はまだコミットしたくないけど、作業状態を一旦クリーンな状態に戻したい」 といった場合に活用することができます。
プロジェクトの開発を行っていると、発生したバグをすぐ直さなければいけないなど、予定外の作業が舞い込んでくることが度々あります。
開発現場では、作業内容ごとにブランチを分けて作業するのが一般的なため、その際には現在作業しているブランチから別のブランチへと切り替える必要が出てきますが、コミットされていない修正内容があると、そのままではブランチを切り替えることができません。
このようなケースの際に役立つのが、この git stashコマンドです。
ブランチの状態を一時的に元に戻すことにより、変更した内容を取り消すことなく、ブランチの切り替え作業などが可能となります。
git stashの使い方
それでは、git stashコマンドの使い方について見ていきましょう。
基本的には以下の構文で、実行したい内容ごとに対応するコマンドを実行します。
git stash 実行コマンドそれぞれのコマンドについて、順に解説していきます。
git stash pushで変更を退避させる
変更内容を退避させる際は、git stash pushコマンドを使用します。
git stashのみでも退避させることは可能ですが、オプションを使用してより様々なケースに柔軟に対応できるため、こちらのコマンドを使うことをおすすめします。
# 追跡済みファイル と ステージ済みファイルを退避
git stash push
# 退避時に任意のコメントを追加
git stash push -m {コメント内容}
# 追跡やステージの状態に関わらず全ファイルを退避(.gitignoreファイルも含む)
git stash push -a
# 追跡やステージの状態に関わらず全ファイルを退避(.gitignoreファイルは除く)
git stash push -u
# 特定のファイルのみ退避
git stash push -- {ファイルパス}
# ステージ済みのファイルをすべて退避
git stash push -S同じく変更内容を退避させるためのコマンドに git stash saveコマンドがありましたが、こちらは現在非推奨となっているので注意が必要です。
git stash listで退避した内容の一覧を表示する
git stashコマンドによって退避する変更内容は、複数の状態を保持することができます。
それぞれの stashを一覧で確認したい場合は、git stash listコマンドを使用します。
git stash liststash@{0}: On master: sample3
stash@{1}: On master: sample2
stash@{2}: On master: sample1保存されている stashは 0が最も最新の状態となり、数字が大きくなるほど古い stashとなります。
左側に記されている「stash@{n}」 の部分は、各コマンドで特定の stashを指定する際に使用します。
git stash applyで退避させていた内容を復旧する
退避させた内容を元に戻す場合は、git stash apply コマンドを使用します。
git stash apply {stash名}stash名を指定した場合は対応する stashが復元され、省略した場合は一番新しい stash(stash@{0} と同等)が復元されます。
ただし、上記のコマンドのみではステージの状態までは復元されないため、変更内容と合わせて元の状態に戻したい場合は、–indexオプションを付けてコマンドを実行します。
git stash apply --indexgit stash dropで不要になったデータを削除する
不要となった stashをリストから削除したい時に使用するのが、git stash drop コマンドです。
git stash drop {stash名}stash名を省略した場合は、git stash apply コマンドと同様に最新の stashが適用対象となります。
ただし、このコマンドは個々の stashを削除するためのコマンドなので、既存の stashをすべて削除したい場合には、git stash clear コマンドを使用しましょう。
git stash cleargit stashの応用的な使い方
基本的なコマンドを抑えたところで、git stash コマンドと合わせて使用すると便利なコマンドなど、応用的な方法についてもいくつか紹介していきたいと思います。
git diffコマンドでstashとの差分を表示する
保存されている stashの一覧は、git stash list コマンドで確認できると解説しました。
しかしながら、stashごとの詳細内容をこのコマンドで表示することはできません。
そこで、細かい変更内容の確認をしたい場合に使用すると便利なのが、git diffコマンドです。
このコマンドを使用すると、現在のディレクトリの状態と指定の stashが保存する変更内容との差分を確認することができます。
git diff {stash名}git diff stash@{0}diff --git a/sample.txt b/sample.txt
index 3a002d8..ba7fc2f 100644
--- a/sample.txt
+++ b/sample.txt
@@ -2,4 +2,3 @@- add:変更をインデックスに登録する
- commit:インデックスの状態を記録する
- pull:リモートリポジトリの内容を取得する
- stash:変更内容を一時退避
stashを復元する前に、このコマンドで差分を確認してから実行すると、より安全に復元することができます。
git stash popでstash applyとstash dropを同時に実行する
stashの復元には git stash applyコマンド、保存済みの stashの削除には git stash drop コマンドと、それぞれの別のコマンドとして紹介しましたが、これらの作業の一度に実行できるコマンドも存在します。
それが、git stash pop コマンドです。
git stash pop stash名applyコマンドの場合は、stashを復元しても内容がリストに保存されているままとなりますが、popコマンドでは復元と同時に stashがリストから削除されます。
復元後に内容を保存しておく必要がない場合には、こちらのコマンドを使用するとより効率的に作業することができます。
まとめ
いかがでしたか?今回は、git stashコマンドを使用する方法について解説しました。
緊急時の退避の他にも、試験的に行った開発内容を一時保存する場合など、様々なケースで活用できるコマンドです。
場合により、保存内容が失われてしまうリスクもゼロではないため、必要以上に多用するのはおすすめしませんが、状況に応じて上手く利用することで、より柔軟に開発を進めることができます。
いざという時のために、使い方を把握しておくと便利です。
Gitの勉強方法は?
書籍やインターネットで学習する方法があります。昨今では、YouTubeなどの動画サイトやエンジニアのコミュニティサイトなども充実していて多くの情報が手に入ります。
そして、より効率的に知識・スキルを習得するには、知識をつけながら実際に手を動かしてみるなど、インプットとアウトプットを繰り返していくことが重要です。特に独学の場合は、有識者に質問ができたりフィードバックをもらえるような環境があると、理解度が深まるでしょう。
ただ、Gitに限らず、ITスキルを身につける際、どうしても課題にぶつかってしまうことはありますよね。特に独学だと、わからない部分をプロに質問できる機会を確保しにくく、モチベーションが続きにくいという側面があります。独学でモチベーションを維持する自信がない人にはプログラミングスクールという手もあります。費用は掛かりますが、その分スキルを身につけやすいです。しっかりと知識・スキルを習得して実践に活かしたいという人はプログラミングスクールがおすすめです。
プログラミングスクールならテックマニアがおすすめ!
ITスキル需要の高まりとともにプログラミングスクールも増えました。しかし、どのスクールに通うべきか迷ってしまう人もいるでしょう。そんな方にはテックマニアをおすすめします!これまで多くのITエンジニアを育成・輩出してきたテックマニアでもプログラミングスクールを開講しています。
<テックマニアの特徴>
・たしかな育成実績と親身な教育 ~セカンドキャリアを全力支援~
・講師が現役エンジニア ~“本当”の開発ノウハウを直に学べる~
・専属講師が学習を徹底サポート ~「わからない」を徹底解決~
・実務ベースでスキルを習得 ~実践的な凝縮カリキュラム~
このような特徴を持つテックマニアはITエンジニアのスタートラインとして最適です。
話を聞きたい・詳しく知りたいという方はこちらからお気軽にお問い合わせください。