HOWTO · Git

IntelliJ IDEA の Git Stash と Shelve

この記事では、IntelliJ IDEA を使用しながら、Git スタッシュと Git シェルフを区別します。

このページの内容

選択したファイルや変更リストを IntelliJ IDEA の管理下に保存して作業を中断するなら、シェルフを使います。作業ツリーの変更を Git の管理下に保存し、Git コマンドや別の Git クライアントから利用したい場合は git stash を使います。どちらも作業を切り替えて後で戻るのに役立ちますが、保存した作業を管理する仕組みは異なります。シェルフは IntelliJ IDEA の機能です。スタッシュはプロジェクト履歴上の通常のコミットではなく、Git レベルでの可搬性が必要な場合、シェルフはその一般的な代替手段にはなりません。

現在の作業の一部だけを退避したいときは、シェルフが便利です。保存した作業を Git コマンドや別のクライアントから利用したいなら、Git のスタッシュが適しています。どちらを選んでも作業はコミットされません。メニュー名や配置は IntelliJ IDEA のバージョンや UI 言語によって異なることがあるため、以下のラベルはすべての環境で同じ場所にあると決めつけず、目印として利用してください。IntelliJ IDEA では Shelve Changes アクションからシェルフを作成できます。git shelve は Git のコマンドではありません。

Gitで変更をシェルフに保存する

IntelliJ IDEA のシェルフを使うと、コミットを作成せずに選択した変更を後で使えるよう保存できます。個別のファイルまたは変更リスト全体を保存でき、シェルフに分かりやすい名前を付けられます。必要であれば、シェルフの変更を複数回適用することもできます。これにより、作業コピーに関係のない作業を残したまま、ひとつのタスクをいったん退避できます。

  1. Commit ツールウィンドウを開き、退避するファイルまたは変更リストを選択します。
  2. コンテキストメニューを開き、Shelve Changes を選択します。
  3. 選択内容を確認し、Commit Message フィールドに分かりやすい名前を入力して、Shelve Changes を選び保存します。

Commit ツールの Shelve Silently アクションを使うと、確認ダイアログを開かずに選択した変更をシェルフに保存できます。選択内容がすでに明確な場合に使いましょう。そうでなければ、保存前にファイルと名前を確認してください。

選択した変更に対する「Shelve Changes」アクションが表示された IntelliJ IDEA の Commit ツール

シェルフに保存した変更を復元する

シェルフを復元するには、Shelf タブを開き、復元するファイルまたは変更リストを選択して Unshelve を選びます。ダイアログで既存の復元先変更リストを選ぶか、新しいリストを作成してから確定します。新しいリストを作成した場合、IntelliJ IDEA でそのリストを現在のリストにしたいときは Active に設定します。この設定は、その後の IDE 上の変更をどのリストにまとめるかを決めるものです。すでにアクティブなリストへ復元する場合は、変更する必要はありません。

ダイアログを開かずに選択したシェルフの変更をアクティブな変更リストへ移すには、Unshelve Silently も使えます。先に意図したリストがアクティブになっていることを確認してください。シェルフの復元では保存した変更が作業コピーに再適用されるため、同じファイルに後から別の編集を加えている場合は、結果を確認しましょう。

Gitでスタッシュを作成する

Git のスタッシュは HEAD との差分として変更を記録します。既定では、git stash はステージ済みと未ステージの編集を含む追跡対象ファイルの変更を保存し、追跡対象ファイルをコミット時点の状態に戻します。未追跡ファイルは既定では含まれません。Git の -u オプションは未追跡ファイルを含め、-a はさらに無視対象のファイルも含めます。GUI のダイアログを使う場合は、表示される選択肢やラベルが異なることがあるため、対象を確認して選んでください。

IntelliJ IDEA で Git > Uncommitted Changes > Stash Changes を開きます。操作対象として表示されているリポジトリのディレクトリとブランチを選び、Message に短い説明を入力して Create Stash を選択します。特に IDE で複数のリポジトリを開いている場合は、保存前に対象のリポジトリとブランチを確認してください。分かりやすいメッセージを付けると、後で該当するエントリを見つけやすくなります。

シェルフとスタッシュでは、変更の選択方法が異なります。IntelliJ IDEA のシェルフではファイルや変更リストを直接選べますが、Git のスタッシュは既定で追跡対象ファイルの変更を扱い、未追跡ファイルや無視対象ファイルを含めるオプションがあります。どちらも再適用できますが、保存先の仕組みが異なるため、それぞれに対応する手順で復元してください。

Gitのスタッシュを適用する

IntelliJ IDEA でスタッシュを確認または復元するには、Git > Uncommitted Changes > Unstash Changes を開き、リポジトリとブランチを選びます。スタッシュを選択して View を選ぶと、適用されるファイルと変更を確認できます。Apply Stash はスタッシュのエントリを残したまま変更を復元します。Pop Stash は変更を適用し、適用が成功した後にエントリを削除します。競合のため pop が完了しない場合は、スタッシュを残して競合を解決してから削除してください。

ダイアログの As new branch オプションを使うと、該当フィールドに指定した名前の新しいブランチ上でスタッシュを適用できます。保存した作業を独立した開発ラインにしたい場合に便利です。現在のファイルが保存時のベースから変わっていると、スタッシュの適用で競合が起きることがあります。作業ツリーがクリーンな状態から始めるのが最も安全ですが、変更のある作業ツリーへの適用が一律に禁止されているわけではありません。ローカルの作業を上書きせずに変更を統合できるかどうかによって、Git が適用できるかが決まります。続行する前に差分を確認し、競合があれば解決してください。