web-dev-qa-db-ja.com

Gitは既存のリモートブランチからワークツリーを追加します

私のリモートリポジトリには3つのブランチ(マスターと2つの長時間実行ブランチ)があります。

master  #the common features are here like Core, DAL,...
north   #customized for A company (long-running)
razavi  #customized for B company (long-running)

私のオフィスPCでは、worktreeブランチとnorthブランチに2つのrazaviを追加します。

$ git worktree list
C:/Source/nis     a6fb6e1 [master]
C:/Source/north   ebc7670 [north]
C:/Source/razavi  eed08a2 [razavi]

これまでのところすべてが大丈夫です。私は自宅からもこのプロジェクトに取り組むことにしましたが、自宅のPCでこれら2つのブランチにワークツリーを追加しようとすると、エラーが発生します。

$git worktree add -b north ../north north
fatal: A branch named 'north' already exists.

新しいブランチを追加しないように-bスイッチを削除しましたが、あまり機能しません。

ローカルではなくリモートである既存のブランチからworktreeを追加するにはどうすればよいですか?

24
vaheeds

TL; DR:おそらくgit worktree add ../north north

最初に、リマインダー(またはこの質問に出くわす他の人のための情報):git worktree addは新しい作業ツリーを作成したいandと同時に、この新しい作業ツリーが他のすべての作業ツリーから別のブランチ名を使用しています。これは、追加された作業ツリーごとに独自のインデックスとHEADがある一方で、HEADファイルは、共有リポジトリ内の基になるブランチポインタsharingに巻き込まれるためです。独立したインデックスオブジェクトを持つ2つの異なる作業ツリーがあるが、同じ基になるブランチがあると、ユーザーが対処するのが難しい問題が発生します。 howを理解しようとするのではなく、プログラマを教育するか、問題に対処するためのツールを提供することによって、git worktreeは状況を完全に禁止します。

したがって、新しい作業ツリーを作成するときにnewブランチ名を作成するのはかなり一般的です。定義により、新しいブランチ名はすべての既存のブランチ名と自動的に異なります。

$ git checkout -b newbranch
Switched to a new branch 'newbranch'
$ git checkout -b newbranch
fatal: A branch named 'newbranch' already exists.

これはかなり自然なことのようです。これに誰も驚かないでしょう。

git worktree addgit checkout -bと同じように実行していますが、新しく追加された作業ツリーでチェックアウトが行われる点が異なります。しかし、northという名前のブランチはすでにあります。

この既存のnorthブランチが役に立たない場合は、削除できます。これで、northという名前のローカルブランチがなくなり、新しいブランチを作成できるようになりました。

この既存のnorthブランチisが便利な場合は、削除しないでください!既存のワークツリーですでにチェックアウトされている場合は、そのワークツリーに移動してそこで作業します。 notがいくつかの既存のワークツリーでチェックアウトされている場合は、-doesがチェックアウトされた新しいワークツリーを作成できます。 -bフラグ(および対応するブランチ名)の使用を避ける必要があるだけです。

git worktree add ../north north

newブランチを作成する場合は、自分で繰り返す必要はありません。

git worktree add -b newbranch ../path

../pathに新しい作業ツリーを作成し、git checkout -b newbranchを使用してデータを入力します。次の場合にのみ、ブランチ名が必要です。

  1. -bを使用していない。
  2. path引数がブランチの名前で終わっていません。

たとえば、パス../zorgの新しい作業ツリーにある既存のブランチzorgをチェックアウトする場合は、次のように実行できます。

git worktree add ../zorg

ここでは、-b zorgも最後の引数もないため、Gitは../zorgの最後の部分(もちろんzorgだけ)を使用してブランチ名を計算します。既存のブランチzorgを新しい作業ツリーにチェックアウトします。

29
torek

この問題の場合、worktree addには--checkoutスイッチが必要です。

$ git worktree add --checkout ../north north
$ git worktree add --checkout ../razavi razavi
3
vaheeds

「リモートブランチを推測する」ことに加えて、私は 他の回答で説明 として、Git 2.18(2018年第2四半期)が新しい機能を提供します。
「_git worktree add_」は既存のブランチをチェックアウトすることを学びました。

commit f60a7b7commit 6427f87commit 2c27002commit d861d34 (2018年4月24日)の を参照してください。 Thomas Gummerer(tgummerer
支援者: Eric Sunshine(sunshineco
Junio C Hamano-gitster- によってマージ commit 10174da 、2018年5月23日)

worktree:「add」に既存のブランチをチェックアウトするように教える

現在、 '_git worktree add <path>_'は、デフォルトでパスのベース名にちなんで名前が付けられた新しいブランチを作成します。
その名前のブランチがすでに存在する場合、 '_--force_'オプションが指定されていない限り、コマンドは何もしません。

しかし、それよりも少し上手くやることができ、他の場所でチェックアウトされていない場合は、ブランチをチェックアウトします。
これは、既存のブランチを新しいワークツリー
にチェックアウトし、キーストロークをいくつか保存したいユーザーに役立ちます。

現在の動作は、パスのベース名の名前を持つブランチがすでに存在する場合、単に 'die()'になるため、ここには後方互換性の心配はありません。

_--force_フラグが渡されない限り、ブランチが別のワークツリーでチェックアウトされている場合でも、 'die()'を使用します。

ドキュメントには次のように記載されています

_$ git worktree add --track -b <branch> <path> <remote>/<branch>
_

_<commit-ish>_が省略され、_-b_も_-B_も_--detach_も使用されない場合、の便宜上、新しいワークツリーは$(basename <path>)にちなんで名付けられたブランチ(これを_<branch>_と呼びます)。

  • _<branch>_が存在しない場合、_-b <branch>_が指定されたかのように、HEADに基づく新しいブランチが自動的に作成されます。
  • _<branch>_が存在する場合、それが新しいワークツリーでチェックアウトされます。それ以外の場所でチェックアウトされていない場合、それ以外の場合、コマンドは拒否しますワークツリーを作成する(_--force_が使用されている場合を除く)。
3
VonC