1. ホーム
  2. 記事一覧
  3. git stashで何ができる? 一時退避の使い方を徹底解説

2024.04.08

git stashで何ができる? 一時退避の使い方を徹底解説

git stashの概要と重要性

Gitは開発者に広く使われているバージョン管理システムです。しかし、開発中に予期せぬ状況が発生することがあります。例えば、新機能開発の最中に緊急のバグ修正が必要になった場合、その作業を安全に退避させたいと思うでしょう。

ここで git stash が役立ちます。git stashを使えば、作業中の変更を一時的に退避させ、クリーンな作業状態に戻ることができます。開発者は柔軟にタスク間を移動でき、作業の効率が高まります。

まだコミットしないけど取っておきたい、そんな大事なものを「こっそりしまって(stash)」後で使う様子をイメージをしていただければいいと思います。

この解説記事では、git stashの基本操作や活用方法、ベストプラクティスなどを説明していきます。

この記事で学べること

  • Git Stash の利点
  • 基本的な操作 (push(saveは非推奨), list, apply, drop, clear)
  • 実践的な活用方法
  • 応用的な操作 (pop, branch)
  • ベストプラクティスと注意点

git stashの基本

git stashとは何か?

本来は遠慮願いたいですが、開発中に上司から「今すぐ修正が必要な重大なバグがある」と、別の作業が舞い込むことは多々あります。git stashは、gitバージョン管理システムの中で、開発者が一時的に作業ディレクトリの変更を退避させることを可能にする機能です。未コミットの変更(ステージングされていない変更やステージングされている変更を含む)を一時的に保存し、作業ディレクトリをクリーンな状態に戻すことができます。その後、開発者は他の作業を自由に行ったり、異なるブランチに切り替えたりすることが可能になります。開発の合間に柔軟に作業を切り替えられるため、生産性が大幅に向上します。

なぜgit stashが必要なのか?

  • 複数のタスクを同時に進行中の場合

    git stashが必要になる典型的なシナリオは、複数のタスクを同時に進行中の場合です。たとえば、ある機能の開発をしている最中に、緊急のバグ修正が必要になった場合を考えてみましょう。この時、未完了の変更をコミットするには早すぎる(もしくはコミットするのが適切でない)ため、これらの変更を安全に退避させる方法が必要です。git stashを使えば、これらの変更を安全に一時退避させ、必要な緊急作業に取り掛かることができます。

  • 別のブランチでの作業に切り替えたい場合

    また、別のシナリオとして、あるブランチでの作業を一時停止して、別のブランチでの作業に切り替えたい場合もあります。このような時に、未完了の変更をコミットせずに退避させることで、ブランチ間の移動をスムーズに行うことができます。

  • 変更をすぐにコミットするか保留する場合

    さらに、git stashは、開発者が新しいアイデアを試したいが、その変更をすぐにコミットするか決めかねている時にも役立ちます。変更をstashに退避させることで、後で再評価する機会を確保しつつ、そのアイデアを安全に保留にすることができます。

これらのシナリオは、日常の開発作業でよく遭遇する状況であり、git stashはこれらの挑戦に対処するための効率的な解決策を提供します。結局のところ、git stashを使用することで、開発者は作業の中断やコンテキストの切り替えを柔軟に行いつつ、効率的にタスクを管理できるようになります。

基本から応用までgit stashのさまざまな活用方法

このセクションでは、git stashの基本的な使い方から応用的な活用方法までを深掘りし、開発プロセスをさらにスムーズにする方法を解説します。

変更点の退避と管理

git stash push
# 非推奨
git stash save

このコマンドは、作業ディレクトリの変更点を退避させる基本的な方法です。git stash push -m "メッセージ"の形式で使用し、退避させる変更に関するメモを追加することができます。このタイミングで使用されるのは、緊急の別の作業に取り掛かる必要があるが、現在の変更を失いたくない場合です。

git stash list

退避した作業の一覧を表示します。どのような変更が退避されているかを確認し、必要な時に適切なstashを選択して作業を再開できます。

実践的なシナリオ

あなたは新しい機能の開発に取り組んでいますが、突然、緊急のバグが発見されました。git stash push "新機能の開発途中"で現在の作業を退避し、バグ修正に集中します。修正後、git stash listで保存された作業を確認し、元の作業に戻る準備をします。

作業の復元とクリーンアップ

git stash apply <stash名>

特定のstashを作業ディレクトリに適用し、退避させた変更を復元します。退避させた作業を続けることができます。

git stash drop <stash名>** と **git stash clear

不要になった変更を削除します。dropは特定のstashを、clearはすべてのstashを削除します。

実践的なシナリオ

緊急のバグ修正を完了した後、git stash applyで以前の開発作業を再開します。作業の再開後、不要になったstashはgit stash dropで個別に、またはgit stash clearで一括して削除し、作業ディレクトリを整理します。

応用操作とブランチ間の作業移動

git stash pop

git stash applyと似ていますが、stashを適用した後に自動的にそのstashを削除します。

変更を一時的に退避させた後、その変更を完全に復元して作業ディレクトリをクリーンに保ちたい場合に便利です。

git stash branch <branch名>

退避された変更を新しいブランチに適用し、そのブランチをチェックアウトします。

退避させた作業が現在のブランチではなく、新しく作成されたブランチで必要になった場合に特に有用です。

実践的なシナリオ

開発中にある機能に取り組んでいる途中で、その変更を別のブランチで利用したいと考えた場合があります。このような場合、git stash branch 新しいブランチコマンドが便利です。

このコマンドを使うと、新しいブランチを作成し、そのブランチで退避させていた作業を直接適用することができます。その結果作業の引き継ぎが簡単になり、効率的に開発を進められます。

たとえば、featureブランチで作業しているときに、その変更を基に新しいexperimentブランチを試したくなったとします。まずgit stash save "機能開発途中"で現在の変更を退避させます。次に、git stash branch experimentを実行して、退避した変更を含む新しいexperimentブランチを作成し、そのブランチに自動的にチェックアウトします。このプロセスにより、新しい機能を試すための新規のクリーンな環境が提供され、同時に元のfeatureブランチはそのまま保持されます。

# 現在の変更を退避する
git stash save "機能開発途中"

# 退避した変更を含む新しいブランチを作成し、そのブランチにチェックアウトする
git stash branch experiment

# 新しいブランチで実験を行う
# ...

# 実験が完了したら、元のブランチに戻り、変更をマージする
git checkout feature
git merge experiment

# 不要になったスタッシュを削除する
git stash drop "機能開発途中"

git stashのベストプラクティスと注意点

git stashを使うことで、開発プロセスをより柔軟かつ効率的に進めることがわかりました。しかし、その機能を最大限に活用するためには、いくつかのベストプラクティスを理解し、一般的な落とし穴を避ける必要があります。

ベストプラクティス

  • 明確なメッセージを使用

    git stash pushを実行する際には、-mオプションを使って変更に関する明確なメッセージを付けることをお勧めします。後でstash一覧を見たときに、各stashが何を含んでいるのかを簡単に識別できます。

    git stash push -m "新しいログイン機能の開発途中"
  • 頻繁に確認し整理

    git stash listを定期的に実行して、stashされた変更を確認しましょう。不要になったstashは、git stash dropやgit stash clearを使って定期的に削除することで、管理しやすくなります。

  • 適切なタイミングで適用

    変更を戻す際には、git stash applyよりもgit stash popを推奨します。popはstashを適用した後にそれを削除するため、不要になった変更がstashリストに残ることを防げます。ただし、変更を失いたくない場合はapplyを使用し、動作を確認してから手動で削除してください。

  • 作業中のブランチに注意

    stashを適用する前に、正しいブランチにいることを確認してください。stashはブランチ間で移動できますが、間違ったブランチに変更を適用すると、混乱が生じる可能性があります。

注意点

  • stashは永久的な保存方法ではない

    重要な変更はコミットとして保存することを心がけてください。stashはあくまで一時的な退避手段であり、gitのデータベースではなく、一時的なエリアに保存されます。

  • 大きな変更をstashに保持しない

    大規模な変更や長期間にわたる作業をstashに保持すると、後で問題が発生する可能性があります。特に、他の人が関与するプロジェクトで作業している場合、コードベースに大きな変更が加わっていると、stashした変更を再適用する際に衝突が発生しやすくなります。

  • stashを過信しない

    特に重要な変更を扱う際には、ブランチを新しく作成してそこにコミットするなど、より安全な方法を検討するべきです。stashは便利ですが、誤って変更を失うリスクも伴います。

これらのベストプラクティスと注意点を念頭に置くことで、git stashをより効果的に、かつ安全に使用することができるようになります。

git stashは途中でセーブして別作業ができる

git stashは、開発プロセスを大きく改善する便利な機能です。この機能を使えば、以下のようなメリットが得られます。

  • 柔軟性の向上

    緊急の修正や他のブランチへの切り替えが必要になっても、進行中の作業を安全に退避させることができます。

  • 作業の中断を最小限に抑える

    未完了の作業を保持したまま、他のタスクに素早く対応できるようになります。

  • クリーンな作業環境の維持

    新たな作業を始める前に、作業ディレクトリをクリーンな状態に保てます。

  • 効率的なコンテキストスイッチ

    コンテキストスイッチとは、別のタスクなどに注意を向けることです。複数のタスクやブランチ間を簡単に行き来でき、スムーズに作業を継続できます。

git stashは、開発者の生産性と柔軟性を大幅に高める、必須の機能と言えるでしょう。覚えられなくても大丈夫、何回でもこの記事を参照してぜひ使いこなしてください。

関連記事

https://envader.plus/article/245

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事