I can see that if I check in from one worktree, the other would end up in a detached HEAD state
実際に、それはないだろう、それが問題です!
各作業ツリーには独自のHEAD
とそれ自身のインデックス(別名ステージング領域またはキャッシュ)があります。全てが実際の基礎となるリポジトリと、基礎となるブランチ・ヒント・ファイル(例えば、.git/refs/heads/mybranch
)を共有します。
2つの異なる作業ツリー(私はそれらを両方ともメインリポジトリから分離して明白な「優先」なものにしません)を両方ともHEAD
がmybranch
と指していて、 2つのワークツリーの一つは:今何が起こるかは通例である
repo$ cd ../worktree1
worktree1$ ... hack away ...
worktree1$ git add bar1 bar2 && git commit -m 'foo some bars'
:Gitは一つ以上の樹木へのインデックスを書き込み、新しいは新しい木を使用してコミット書き込み、mybranch
は、親がコミットように解決コミット何でも新しいコミットを指すようにmybranch
を更新します。 worktree1
の索引は、新しいコミットと一致するようになりました。今、何が起こる
worktree1$ cd ../worktree2
worktree2$ ... modify unrelated file, not bar1 or bar2 ...
worktree2$ git add unrelated && git commit -m 'unrelated change'
は、Gitは、インデックスの書き込みを行うということです...待って、インデックス:今、私たちはこれを行いますか? どのインデックス?よく、インデックス - インデックスはworktree2
です。どのファイルが変更されておらず、worktree1
から追加されています。 (それはまったく新しいものでない限り、2つのbar
ファイルを持っていますが、古いバージョンです。)Gitは1つ以上のツリーにインデックスを書き込み、新しいツリーを使って新しいコミットを書き込みます。 mybranch
はその親として解決され、mybranch
は新しいコミットを指すように更新されます。 1
が../worktree1
で行われたコミットされ、そして2
がworktree2
にコミットを行っている
...--o--1--2
:
はチェーンをコミットするには次のようになります。両方の作業ツリーの中のmybranch
という名前は、コミットを指す2
です。どちらの作業ツリーにもHEAD
という名前には、ref: refs/heads/mybranch
が含まれています。もちろん、2つの作業ツリーのインデックスファイルは異なります。
内容コミット1
の内容は、worktree1
のインデックスに含まれています。 bar1
とbar2
に加えた変更があります。
内容コミットのために2
は、worktree2
のインデックスにあるものはすべてです。unrelated
に変更がありますが、にはbar1
とbar2
の変更がありません。実際には、worktree2
で行ったコミットは、の2つのファイルを元に戻しました!
一方または両方の作業ツリーを「分離HEAD」状態にしたい場合は、git checkout --detach mybranch
またはgit checkout refs/heads/mybranch
でそれらをチェックアウトすることができます。今では少なくとも1人がHEAD
をブランチ名ではなく、コミットを直接指し示し、Gitは2つの作業ツリーにコミットをチェックアウトさせるべきです。
ありがとうございます。私はgitがチェックアウトが現在のブランチコミットにはなくなっていることに気付き、デタッチされたHEAD状態のように動作すると思います。 –
いいえ、分離されたHEADを取得するには、ファイル '.git/HEAD'に生ハッシュIDが必要です。これは任意のブランチ名とは無関係に発生します。つまり、HEADは記号であり、その名前が '.git/HEAD'であるブランチ上にあるか、生ハッシュIDを持っているため、そのハッシュを現在のものとしてデタッチしますコミット。 git checkout --detach mybranch'を試してみましょう。(これは主にgit checkoutで '.git/HEAD'を修正していますが、' git symbolic-ref'でも可能です) – torek
時には、ブランチのきれいなチェックアウトでテストを実行したいが、何も変更しないので、分離されたHEADは問題ありません。 –