最初に、あなたの質問が少し誤解を示していることに注意してください。origin / HEADは、リモートのデフォルトブランチを表します。つまり、オリジンを呼び出しているリモートリポジトリにあるHEADです。リポジトリのブランチを切り替えても、影響はありません。リモートブランチについても同様です。あなたが持っているかもしれないmaster
とorigin/master
、あなたのレポ、中origin/master
のローカルコピーを表すmaster
リモートリポジトリにブランチを。
originのHEADは、あなたまたは誰かがリモートリポジトリで実際に変更した場合にのみ変更されます。これは基本的には発生しません。安定したブランチ(おそらくマスター)で、デフォルトのブランチとパブリックリポジトリを一定に保ちます。origin / HEADは、リモートリポジトリ内のHEADのローカルコピーを表すローカル参照です。(そのフルネームはrefs / remotes / origin / HEADです。)
上記はあなたが実際に知りたかったことの答えだと思いますが、先に進んで明示的に尋ねた質問に答えます... origin / HEADは、リポジトリのクローンを作成するときに自動的に設定されます。奇妙なことに、次のようなコマンドでは設定されないgit remote update
-手動で変更した場合にのみ変更されると思います。(変更とは、別のブランチを指すことを意味します。そのブランチが変更されると、コミットが変更を指すことを意味します。これは、フェッチ/プル/リモート更新で発生する可能性があります。)
編集:以下で説明する問題はGit 1.8.4.3で修正されました。このアップデートをご覧ください。
ただし、小さな注意事項があります。HEADはシンボリック参照であり、直接コミットを指すのではなくブランチを指しますが、gitリモート転送プロトコルは参照のコミットのみを報告します。したがって、GitはHEADと他のすべての参照によって指されたコミットのSHA1を知っています。次に、同じコミットを指すブランチを見つけて、HEADの値を推定する必要があります。これは、2つのブランチが偶然そこを指している場合、あいまいであることを意味します。(私は、最初のアルファベット順にフォールバック、可能であればそれはマスターを選ぶと信じています。)あなたは、これはの出力で報告され表示されますgit remote show origin
:
$ git remote show origin
* remote origin
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
foo
master
奇妙なことに、このように印刷されたHEADの概念は、リモートで変更があった場合(たとえば、fooが削除された場合)は変わりますが、実際には更新されませんrefs/remotes/origin/HEAD
。これは本当に奇妙な状況につながる可能性があります。上記の例で、origin / HEADが実際にfooを指していて、originのfooブランチが削除されたとしましょう。その後、これを行うことができます:
$ git remote show origin
...
HEAD branch: master
$ git symbolic-ref refs/remotes/origin/HEAD
refs/remotes/origin/foo
$ git remote update --prune origin
Fetching origin
x [deleted] (none) -> origin/foo
(refs/remotes/origin/HEAD has become dangling)
したがって、リモートショーはHEADがマスターであることを知っていても、何も更新しません。古いfooというブランチが正常に剪定され、そしてHEADは(存在しないブランチを指す)ダングリングになり、それはまだマスターを指すように更新されません。これを修正したい場合は、を使用します。これにより、git remote set-head origin -a
上記のようにoriginのHEADが自動的に決定され、実際にorigin / HEADが適切なリモートブランチを指すように設定されます。
refs/origin/HEAD
。リポジトリ自体のシンボリック参照HEAD
がどのように設定されるかについてではありません。