コードを書いている途中で急に別の作業を求められたり、ブランチを切り替えたりする必要が出るとき、未コミットの変更をどうするか悩みます。commitするには中途半端だし、変更を捨てるわけにもいかない。そこでGit stashを使えば、変更を一時的に保管して作業ディレクトリをクリーンな状態に戻せます。この記事ではGit stashの使い方を基本から実践的な応用まで解説しますので、変更管理をもっと柔軟にしたい人に最適です。
Git stash 使い方:基本操作と押さえておくべきコマンド群
Git stashを使うとき、まず知っておくべきのはどのコマンドが何をするかという基本群です。どのような場面で使えるか、基本コマンドの役割を理解しておくと、実践で迷わなくなります。ここではstashの作成から適用、一覧表示、削除までをカバーします。
stash 作成(保存)方法
一時退避させるにはまず変更をstashに保存します。最も基本的なのは「git stash push」(または古い環境では「git stash save」)で、追跡対象の変更(ステージ済み/未ステージいずれも)を保存し、作業ディレクトリをきれいにします。オプションなしで使うと、追跡されているファイルのみ保存の対象になります。変更内容に説明を添えたいときは‐mオプションでメッセージを付けます。
stash 適用(再利用)の方法
保存したstashを適用するには主に二つのやり方があります。ひとつは「git stash apply」で変更を適用するがstash自体は残す方法、もうひとつは「git stash pop」で変更を適用すると同時にそのstashをスタックから削除する方法です。どちらを使うかは状況次第で、安全重視ならapply、作業が終わって不要ならpopを使います。
stash 一覧表示・詳細確認
どのstashがどんな内容か忘れないように、保存されたstashを一覧で見るコマンドが「git stash list」です。各stashにはstash@{0}, stash@{1}…のような識別子が付きます。さらに「git stash show」で概要を、「git stash show ‐p」でパッチ形式で差分を詳しく確認できます。これにより、いつどのstashを適用するか判断しやすくなります。
stash 削除・整理の方法
stashが増えすぎると混乱の元になります。不要になったstashは「git stash drop stash@{n}」で個別に削除できます。すべてを一気にクリアしたいときは「git stash clear」で全stashを消去できます。特に旧いstashはマージ時の競合を引き起こすこともあるため、定期的に整理しておくことが望ましいです。
応用編:Git stash 使い方を応用してワークフローを改善する方法
基本を押さえたら、次は応用です。stashを一時退避だけでなく、複雑なブランチ切り替え、部分的に退避、無視ファイルの扱いなど実務で役立つテクニックを身につけると、作業の柔軟性が飛躍的に上がります。
ブランチをまたがるstashの活用
stashした変更は現在のブランチだけでなく他のブランチにも適用できます。「git stash branch 新しいブランチ名 stash@{n}」を使うと、stashした際の基点のコミットから新しいブランチを作り、そのstashを適用した状態で切り替えることができます。これによって複数の機能を同時に並行して作業したいときにも干渉を減らせます。
部分的に変更をstashする方法
ファイルの中に関係ない部分も混じっているとき、全部をstashしたくないことがあります。その場合、‐pオプションを使ってインタラクティブに変更の塊(hunk)単位でstash対象を選べます。「git stash push ‐p ‐m “メッセージ”」などで実行すると、どの部分をstashに含めるか選択肢が表示されます。このように部分的に制御できることで、より精密な変更管理が可能になります。
未追跡ファイル・無視ファイルも対象にする方法
基本のstashでは追跡されていないファイルや.gitignoreで無視されているファイルは対象外です。しかし、実際にはそれらも一時退避したいことがあります。‐uオプション(‐‐include‐untracked)で未追跡ファイルを含め、さらに‐aオプション(‐‐all)を使えば無視ファイルも含めてstashできます。ただしログやビルド成果物などを含めてしまうこともあるため、慎重に使うべきです。
実践例:Git stash 使い方をケーススタディで理解する
具体的なシナリオを通してGit stashの使い方を実践で学びます。実際に直面しやすい場面を想定して、それぞれにどう対応するかステップを追って解説します。
ケース1:バグ対応のために急にブランチを切り替えたいとき
機能開発中に緊急のバグが飛び込んで、今作業中のコードをコミットできない状態で別ブランチに切り替えたいことがあります。このときはまず「git stash push ‐m “途中作業内容”」で変更を退避させます。ブランチ切り替え後、バグを修正してcommitし、その後元の開発ブランチに戻って「git stash pop」で変更を元に戻します。stashが消えることを理解しておけば安全です。
ケース2:共通の修正を複数のブランチへ適用したいとき
ある変更が機能Aと機能Bの両方で必要な修正だった場合、変更をAブランチにstashしてapplyし、その後Bにも同じstashをapplyする、といった使い方ができます。popではなくapplyを使うことでstashが残るため、何度も使い回せます。各ブランチでの競合をチェックしながら作業するとトラブルを避けやすくなります。
ケース3:マージやrebase直前にワークツリーをきれいにするために
マージやrebaseを行う前にローカルの未コミット変更があると競合が起きやすいです。そのため作業中の変更をstashし、その後マージやpull、rebaseを実行します。処理が完了したらstashをpopまたはapplyで戻します。これでクリーンな状態でメージ操作を行えるため、予期せぬ競合を減らすことができます。
Git stash 使い方:applyとpopの違いと注意点
applyとpopは似ているようで異なる役割を持ちます。また、使用する上での注意点や、特定のオプションの使い方も理解しておく必要があります。ここではそれらの違いとリスク管理について整理します。
apply vs pop の基本的な違い
applyはstashを適用するだけでスタックからは削除しません。複数のブランチに同じ変更を繰り返し使いたいときに便利です。一方popはapply+dropに相当し、適用と同時にスタックのそのstashを消します。作業がひと段落し、同じstashが不要になったときに使います。誤ってpopで必要なstashを消してしまう事故を防ぐためにも違いを明確に把握しておくことが大切です。
競合が起きたときの扱い
stashを適用した先でファイル内容が既に変更されている場合、競合が起きることがあります。applyでもpopでも競合があれば手動で解消が必要です。popの場合、競合が起きるとstashは削除されず、applyと同じ挙動になります。またindexの状態を復元するオプション(‐‐index)を使うと、変更されたステージ上のファイルも可能な限り元の状態に戻そうとしますが、意図しない衝突を招くこともあります。
stash の内容を保持したまま作業したいときのオプション利用
stashを作るときにメッセージを付けたり、keep‐indexオプションを使ってステージ済みの変更を作業ディレクトリに残したりすることができます。さらにuntrackedファイルやignoredファイルを含めたい場合には‐uまたは‐aオプションを使います。これらのオプションを組み合わせることで、保存対象を細かく制御できます。ただし多くのファイルを含めすぎるとstashの復元や管理が煩雑になるため、必要な部分だけを退避させるのが望ましいです。
Git stash 使い方:ワークフローへの組み込みとベストプラクティス
Git stashを日常の開発フローにスムーズに取り入れるための方法と、失敗しにくい使い方について解説します。チームでの協調作業や複数機能を同時に開発するケースで役立つポイントを押さえます。
コミットやブランチ戦略との連携
stashはコミットやブランチ戦略を補完するツールとして使うと効果的です。機能ごとのブランチ運用をしている場合、作業途中でブランチを切り替えたいときにstashで状態を保存し、終了後に元ブランチで復帰。commitすべき変更は小さく分けておき、stashはあくまで一時的な手段として使うことが推奨されます。コミットログの粒度を保つためにも、stashは機能の単位で使うように心掛けてください。
メッセージ付けや命名規則の整備
stashにデフォルトのメッセージだけを使っていると、後でstash listを見たときに何を保存したのか判断しにくくなります。保存する際には「git stash push ‐m “機能Xの途中”」など、何をしていたか分かるようにメッセージを付けるようにしましょう。命名規則をチームで共有しておくと、誰がどのstashを使えるか把握しやすくなります。
stash を溜めすぎない管理ルールの策定
stashが多数残っていると一覧が読みづらくなり、過去のstashを取り違える原因になります。定期的な整理として、古いstashをdropする、使わないものはclearで消すなどのルールを設けましょう。特にマージ前後やリリース前にはstashを整理しておくと、予期せぬトラブルを防げます。
まとめ
Git stashは作業中の変更を一時退避させ、作業ツリーをクリーンに保つのに最適なツールです。基本コマンドを理解し、applyとpopの違いを把握することでミスを防げます。
応用シーンではブランチ間での移動、部分的退避や未追跡ファイルの扱いなどが重要です。適切なオプションを使うことで使いこなせるようになります。
実践的にはメッセージ付け、stashの整理ルールをチームで決めておくことが生産性向上に繋がります。stashはあくまで一時的な手段として位置づけ、コミットとブランチ戦略と連携させて活用しましょう。
コメント