【Git】git stash で特定ファイルを指定する方法を初心者向けに解説

Web開発

はじめに

Gitを使って開発を行う場合、作業途中で別の作業が急に発生することは珍しくないかもしれません。 そのような場面で便利なのが git stash という仕組みです。

しかし、すべての変更をまとめて退避するだけでなく、特定のファイルだけを一時的に退避したいケースもあるでしょう。 そこで、本記事では git stash ファイル指定方法 を中心に、初心者の皆さんにもわかりやすく解説していきます。

この記事を読むとわかること

  • git stash の基本的な仕組み
  • 特定のファイルのみをstashするための具体的なコマンド
  • インタラクティブモード(パッチモード)を使った部分的なstash方法
  • 実務での活用シーンと注意点
  • stashした変更を復元する手順

ここから順番に解説しますので、ぜひ参考にしてみてください。

git stash とは?

一時的に変更を避難させる仕組み

Gitでファイルを編集している途中に「別のブランチに切り替えたい」「別作業を先に片付けたい」といった状況が発生することがあります。 その際に、まだコミットしたくない変更が手元に残っていると、別のブランチへ移ろうとするときやチームメンバーとの共同作業時にややこしくなるかもしれません。

そういう状況を回避できるのが git stash です。 stashを使うと、作業途中の変更を「一時的に別の場所(スタッシュ)に置いておく」ことができます。 そして、あとから必要になったときに、いつでもその変更を元に戻せます。

stashの内部的な構造

stashを実行すると、Gitは差分をパッチのような形で管理します。 内部ではコミットオブジェクトとインデックスの情報がペアになっており、一覧を確認したいときは git stash list でスタッシュの履歴を見られます。 複数のstashを積み重ねると、まるでスタックのように「上に積んでいくイメージ」で管理できます。

git stash でファイルを指定する方法

ここから、特定のファイルだけをstashする方法を見ていきます。 実は git stash コマンドには、単純に git stash を実行する以外にも、複数の使い方があります。

単一ファイルをstashする方法

もし、まだワーキングツリー(作業中の変更)がコミットされていない状態だとしましょう。 そのうちの1つのファイルだけstashしたい場合、次のように書きます。

git stash push -m "stash a single file" <ファイル名>

-m オプションでメッセージを残すと、git stash list を見たときに内容を把握しやすくなります。 この方法なら変更したいファイル1つだけを指定して、一時的に取り除くことができます。

例えば、index.html を部分的に修正していたけれど、他の変更は作業中のままにしておきたい場合に便利です。

複数ファイルをstashする方法

単一ファイルと同様に、複数ファイルを指定してstashしたい場合は、ファイル名をスペース区切りで並べます。

git stash push -m "stash multiple files" -- file1.txt file2.txt

-- を入れてからファイル名を列挙するやり方は、オプションとファイル名を区別するための方法です。 これにより、複数のファイルだけを一度に stash できます。

この機能は、たとえば「HTMLファイルとCSSファイルの一部だけを一時的に保管する」といったケースで役立ちます。 まだ作業途中の他のファイルにはまったく手を加えず、選んだファイルだけ対象にできるのがポイントです。

インタラクティブモードで部分的にstashする方法

Gitには インタラクティブモード(patchモード)と呼ばれるやり方もあり、変更行単位でstashすることができます。

git stash push -p

-p(patch)を指定すると、ファイルを行ごとに確認して、「これはstashに含める」「これは含めない」を対話的に選択できます。 複数行や1行だけを細かく管理したいときに非常に便利です。

インタラクティブモードを使うと、1つのファイルの中でも不要な部分はstashせずに残し、必要な部分だけstashするといった微調整が可能です。 作業途中のコードが膨大になっている場合でも、重要な変更だけを一時保存できるため、実務でも扱いやすい方法でしょう。

インタラクティブモードでは、各変更内容を表示したうえで、ステージに含めるかどうかを選べます。 これにより、微妙な差分をさらに細かく制御できます。

実務での活用シーン

ここまで、ファイル指定や部分的なstashの方法を見てきました。 それでは、実際の開発現場ではどのようなタイミングで活用できるのでしょうか。

コンフリクト回避に役立つ

他のブランチで急に作業をしなければならないとき、まだコミットしたくないファイルがある場合はありますよね。 そんなときにstashを使うと、作業途中の状態を一時保管して別ブランチに移動できます。

もしstashを行わずにブランチを変えて作業を始めると、コンフリクトが発生する恐れもあるでしょう。 stashで安全に変更を退避しておけば、ブランチを移動したり、別の修正を加えたりしても、後で簡単に元に戻せるため混乱が少なくなります。

緊急対応時に途中作業を安全に保管

開発チームでは、突発的な不具合対応をしなければいけない場面があるかもしれません。 たとえば「本番環境でバグが見つかったので早急に修正が必要」というときです。

このようなケースで、作業途中のコードが壊れているかもしれないのに、いったんコミットしてしまうのはリスクが大きいです。 stashを利用すれば、途中の修正をコミットしなくても一時保管できるので、不具合対応のブランチにさっと切り替えられます。

git stashを復元する方法

stashした変更を元に戻すときは、主に以下の2種類を使います。

git stash pop
git stash apply

git stash pop は、スタッシュの内容をワーキングツリーに適用し、適用後にスタッシュを削除します。 一方、git stash apply はスタッシュを適用しても、スタッシュが削除されません。

複数のstashを積み重ねている場合は、git stash list で一覧を確認して、例えば stash@{1} のように指定して戻すこともできます。

git stash pop stash@{1}

このように書くと、2番目に記録されたstashを適用できます。 applyのほうを使うと削除はされないため、あとで同じstashを何度でも適用したい場合に便利です。

popやapplyでコンフリクトが発生する場合があります。 stashを適用する前に、作業ツリーを整理したり、衝突が起きにくい状況を作っておくことがおすすめです。

スタッシュを管理するコマンド

stashを活用するには、いくつかの補助的なコマンドも覚えておくと便利です。 基本的なものをピックアップしてみます。

git stash list

今までにstashした履歴を一覧表示します。メッセージ(-mで指定したもの)が見えるため、複数のstashを管理しやすくなります。

git stash drop stash@{n}

指定したstashを削除します。必要なくなった古いstashを整理するのに役立ちます。

git stash clear

すべてのstashを一括で削除します。うっかり使うと、まだ必要だったstashまで消してしまうので注意が必要です。

このように、stashしたデータは「いつでも復元できる」一方で、どんどん積み上がっていくので、不要になったものは整理しておくとよいでしょう。

まとめ

Gitの作業途中で別の作業を急いで行いたいことは珍しくないかもしれません。 そんなときに、git stash は非常に頼りになる機能でしょう。

特に、作業途中のすべてのファイルではなく、一部のファイルだけをstashしたいケースもあります。 git stash push <ファイル名>-- で複数ファイルを指定する方法に加えて、-p オプションを使ったインタラクティブモードを駆使すれば、行単位で細かく変更を退避できます。

このような細かいコントロールが可能になると、緊急対応時やブランチ切り替え時の混乱を大きく減らせます。 また、git stash popgit stash apply で簡単に変更を復元できるため、ストレスなく作業に復帰できるでしょう。

ファイルを指定してstashするテクニックを身につけておくと、チーム開発や複雑なブランチ運用においても柔軟に対応できます。 今後、作業途中の変更を安全に一時保管したいタイミングが出てきたときには、ぜひ今回の方法を思い出してみてください。

Gitをマスターしよう

この記事で学んだGitの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。