git worktree:複数のブランチを同時にチェックアウトする
git worktreeガイド
git worktree:add、list、remove、pruneの使い方と例 | We.Inc
新しいブランチ、既存のブランチ、detachedコミット用の正確なgit worktree addコマンドを作成し、worktreeを安全に一覧、ロック、移動、削除、pruneする方法を解説します。
git worktreeを使うと、1つのリポジトリに複数の作業フォルダーを持たせ、それぞれ別のブランチを開きながら、1つのオブジェクトストアを共有できます。git worktree add ../hotfix -b hotfixで新しいブランチの新しいフォルダーを作り、git worktree listですべてを確認し、終わったらgit worktree remove ../hotfixを実行します。2つ目のクローンは不要です。
日常的に使うworktreeコマンド
- 新しいブランチで新しいフォルダーを作る
- git worktree add ../app-fix -b fix/login
- 既存のブランチで新しいフォルダーを作る
- git worktree add ../app-review feature/cart
- 特定のコミットで使い捨てのフォルダーを作る
- git worktree add --detach ../app-old v1.4.0
- すべてのworktreeを確認する
- git worktree list
- worktreeを削除する
- git worktree remove ../app-fix
- 手動で削除したフォルダーを片付ける
- git worktree prune
ちょっとした修正を頼まれるたびにstashし、ブランチを切り替え、ビルドし直すのは時間の無駄です。worktreeを使えば、同じリポジトリの2つ目のチェックアウトを別のフォルダーに持てるので、時間のかかるテスト、コードレビュー、緊急のパッチをそれぞれ別のディレクトリで進められます。ビルダーでコマンドを作成し、あまり使わないサブコマンドはリファレンスで確認しましょう。
- 使いたいフォルダーとブランチ名を入力し、新しいブランチ、既存のブランチ、detachedコミットのいずれかを選びます。
- addコマンドをコピーし、メインのチェックアウトの中で実行します。
- 新しいフォルダーでは普通のクローンと同じように作業します。そこでcommit、push、pullができます。
- ブランチがマージされたら、ビルダーが表示するremoveコマンドを実行します。フォルダーを手動で削除したことがある場合はpruneも実行します。
- worktreeは../app-fixのように兄弟フォルダーとして置き、メインのチェックアウトのツリー内に入らないようにしましょう。
- 各worktreeには、それぞれインストールした依存関係とビルド出力が必要です。フォルダーごとのnode_modules分のディスク容量を見込んでおきましょう。
- 1つのブランチは、同時に1つのworktreeでしかチェックアウトできません。addが拒否された場合は、git worktree listでどこで開かれているかを確認しましょう。
- リムーバブルドライブ上のworktreeは、git worktree lock --reason "usb disk"でロックしておきましょう。取り外している間にpruneで消されなくなります。
よくある質問
worktreeとクローンの違いは何ですか?
クローンは履歴を含むリポジトリ全体をコピーします。リンクされたworktreeは元のリポジトリのオブジェクトとrefを共有し、新しい作業フォルダーと少しのメタデータを追加するだけです。そのため、ある場所で作ったコミットはfetchしなくても他の場所からすぐに見えます。
2つのworktreeで同じブランチを使えますか?
デフォルトではできません。2つのフォルダーが1つのブランチを動かすと互いの作業を上書きしてしまうため、git worktree addはすでに別の場所でチェックアウトされているブランチを拒否します。--forceで上書きできますが、ほとんどの場合はdetached HEADか別のブランチを使うほうが適切です。
git worktree removeが失敗するのはなぜですか?
作業を失わないよう、フォルダーに変更された追跡ファイルや未追跡ファイルがあると拒否します。先にコミットするかフォルダーをきれいにするか、--forceを付けてください。ロックされたworktreeには--forceを2回付ける必要があります。
git worktree pruneは何をしますか?
フォルダーがもう存在しないworktreeについて、gitが保持している残りの記録を削除します。たとえばrm -rfでフォルダーを消した後です。先に何が削除されるかを確認するには-nを付けます。
worktreeのフォルダー名を変更したり移動したりするには?
gitが記録を更新できるよう、git worktree move <worktree> <new-path>を使います。すでにファイルマネージャーで移動してしまった場合は、新しい場所からgit worktree repairを実行して再接続しましょう。
worktreeを使うべき場面
- 作りかけの作業を崩さずにプルリクエストをレビューする、あるブランチで遅いテストスイートを走らせながら別のブランチでコードを書く、アプリの2つのバージョンを並べて比較する、というのが代表的な使い方です。
- 1つのリポジトリで複数のコーディングセッションを動かすツールにも向いています。各セッションが専用のフォルダーとブランチを持つので、あるセッションの未コミットのファイルが別のセッションのビルドに紛れ込むことはありません。
共有されるものとされないもの
- すべてのworktreeは、コミット、ブランチ、タグ、リモート、ほとんどの設定を共有します。HEAD、インデックス、作業ファイルはそれぞれ別なので、あるフォルダーでステージしても他のフォルダーには影響しません。
- .env、node_modules、ビルドフォルダーなどの無視されたファイルは、新しいworktreeにはコピーされません。何かを実行する前に、envファイルを自分でコピーし、依存関係をインストールしましょう。
git worktreeのすべてのサブコマンド
git worktreeのサブコマンドと構文
- git worktree add [-b <new-branch>] <path> [<commit-ish>]
- フォルダーを作成し、そこでブランチまたはコミットをチェックアウトする
- git worktree list [-v | --porcelain]
- すべてのworktreeをHEADとブランチ付きで表示する。--porcelainはスクリプト向け
- git worktree remove [-f] <worktree>
- きれいな状態のworktreeフォルダーとその記録を削除する
- git worktree prune [-n] [-v]
- フォルダーがなくなったworktreeの記録を消す
- git worktree move <worktree> <new-path>
- worktreeフォルダーを移動し、gitの記録を更新する
- lock / unlock
- git worktree lock [--reason <text>] <worktree>
- worktreeがprune、移動、削除されないようにする
- git worktree repair [<path>...]
- フォルダーを手動で移動した後にworktreeを再接続する
今のブランチを離れずにhotfixする
機能開発の途中で本番環境にパッチを当てる
機能開発のフォルダーはそのまま残ります。修正は兄弟フォルダーで行い、pushしたら削除します。
スクリプトで扱いやすい形式でworktreeを一覧表示する
各worktreeは空行で区切られた複数行のブロックで、パス、HEADのハッシュ、ブランチ(またはdetached)が並びます。
worktreeコマンドビルダー
worktree用のフォルダー
ブランチ名
開始点(ブランチ、タグ、コミット)
チェックアウトするもの
新しいブランチ
既存のブランチ
detachedコミット
作成して開く
作業が終わったら
フォルダーのパスを入力すると、コマンドが表示されます。
ヒント:../で始まるパスにすると、新しいフォルダーがメインのチェックアウトの隣に作られます。
無料で始める · クレジットカード不要
関連: ガイド|Webマーケティングと集客を学ぶ
製品
ご利用いただける方
機能
リソース
会社情報
サイトマップを見る