私のリモートリポジトリには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
を追加するにはどうすればよいですか?
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 add
をgit 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
を使用してデータを入力します。次の場合にのみ、ブランチ名が必要です。
-b
を使用していない。たとえば、パス../zorg
の新しい作業ツリーにある既存のブランチzorg
をチェックアウトする場合は、次のように実行できます。
git worktree add ../zorg
ここでは、-b zorg
も最後の引数もないため、Gitは../zorg
の最後の部分(もちろんzorg
だけ)を使用してブランチ名を計算します。既存のブランチzorg
を新しい作業ツリーにチェックアウトします。
この問題の場合、worktree add
には--checkout
スイッチが必要です。
$ git worktree add --checkout ../north north
$ git worktree add --checkout ../razavi razavi
「リモートブランチを推測する」ことに加えて、私は 他の回答で説明 として、Git 2.18(2018年第2四半期)が新しい機能を提供します。
「_git worktree add
_」は既存のブランチをチェックアウトすることを学びました。
commit f60a7b7 、 commit 6427f87 、 commit 2c27002 、 commit 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
_が使用されている場合を除く)。