1. ホーム
  2. git

[解決済み] 原点/HEADはどのように設定されるのですか?

2022-05-02 13:49:26

質問

オリジンでの参照元を追跡するためにブランチを設定しています。 git checkout <branchname> はそのブランチに切り替わり git status は、自分のブランチがオリジンからどれくらい進んでいるか、遅れているかを示してくれますが origin/HEAD を指したままです。 origin/master であって origin/<branchname>

そこで質問なのですが、どのような場合にorigin/HEADが移動するのでしょうか?

EDIT

についてお答えいただき、ありがとうございました。 なんと しかし、私が明示的に指示する以外では、何が有機的に動いているのかに興味があります。

例えば、私がブランチを切り替えたとき、gitは私がチェックアウトしているブランチをHEADのポイントにするのですが、同じようにorigin/HEADが移動しないことに驚いています。

解決方法は?

まず、あなたの質問には少し誤解があることに注意してください。 origin/HEAD はリモートのデフォルトブランチを表します。 つまり、あなたが origin と呼んでいるリモートリポジトリにある HEAD です。自分のリポジトリでブランチを切り替えても、そのブランチには影響を与えません。リモートブランチについても同じことが言えます。 masterorigin/master を、あなたのレポで origin/master のローカルコピーを表します。 master ブランチをリモートリポジトリの

origin の HEAD は、あなたや他の誰かがリモートリポジトリで実際に変更した場合にのみ変更されます。 公開レポのデフォルトブランチは、安定版ブランチ(おそらく master)で一定であることが望ましいのです。 origin/HEADは、リモートリポジトリのHEADのローカルコピーを表すローカルリファレンスです。 (フルネームは refs/remotes/origin/HEAD です。)

上記はあなたが実際に知りたかったことの答えだと思いますが、先にあなたが明示的に尋ねた質問に答えますと... origin/HEADはリポジトリをクローンしたときに自動的に設定されます、そしてそれはその程度のことです。奇妙なことに、それが ではなく のようなコマンドで設定します。 git remote update - 変更する唯一の方法は、手動で変更する場合だと思います。(変更というのは、別のブランチを指すということです。ブランチが変更されると、指すコミットも当然変更されます。これはフェッチ/プル/リモートアップデートで起こるかもしれません)。


編集 : で後述の問題を修正しました。 Git 1.8.4.3 参照 今回の更新 .


しかし、小さな注意点があります。HEAD はシンボリックな参照で、コミットを直接指すのではなくブランチを指します。しかし、git リモート転送プロトコルでは、参照に対してのみコミットを報告します。そのため、Git は HEAD とその他のすべての ref が指すコミットの SHA1 を知っています。そして、同じコミットを指すブランチを見つけることで HEAD の値を推測しなければなりません。これは、ふたつのブランチがたまたまそこを指していた場合、それが曖昧になることを意味します。(可能であれば master を選び、その後アルファベット順に first にフォールバックすると思います)。の出力でこのことが報告されます。 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 はぶら下がった状態 (存在しないブランチを指している) になります。 まだ は、master を指すように更新されません。もしこれを修正したいのなら git remote set-head origin -a これは、上記のように origin の HEAD を自動的に決定し、その後 origin/HEAD が適切なリモートブランチを指すように実際に設定します。