Beachten Sie zunächst, dass Ihre Frage ein kleines Missverständnis aufweist. origin / HEAD stellt den Standardzweig auf der Fernbedienung dar , dh den HEAD, der sich in dem Remote-Repository befindet, das Sie origin nennen. Wenn Sie die Filialen in Ihrem Repo wechseln, hat dies keine Auswirkungen. Gleiches gilt für entfernte Zweige. Möglicherweise haben Sie masterund origin/masterin Ihrem Repo, wo origin/mastereine lokale Kopie des masterZweigs im Remote-Repository darstellt.
Der HEAD von origin ändert sich nur, wenn Sie oder eine andere Person ihn tatsächlich im Remote-Repository ändern. Dies sollte grundsätzlich nie passieren. Sie möchten, dass der Standardzweig eines öffentlichen Repos im stabilen Zweig (wahrscheinlich Master) konstant bleibt. origin / HEAD ist eine lokale Referenz, die eine lokale Kopie des HEAD im Remote-Repository darstellt. (Der vollständige Name lautet refs / remotes / origin / HEAD.)
Ich denke, das Obige beantwortet, was Sie eigentlich wissen wollten, aber um fortzufahren und die Frage zu beantworten, die Sie explizit gestellt haben ... origin / HEAD wird automatisch festgelegt, wenn Sie ein Repository klonen, und das war's auch schon. Seltsamerweise wird es nicht durch Befehle wie git remote update- Ich glaube, der einzige Weg, wie es sich ändern wird, ist, wenn Sie es manuell ändern. (Mit Änderung meine ich, auf einen anderen Zweig zu verweisen; offensichtlich zeigt das Festschreiben auf Änderungen, wenn sich dieser Zweig ändert, was beim Abrufen / Ziehen / Remote-Update passieren kann.)
Bearbeiten : Das unten diskutierte Problem wurde in Git 1.8.4.3 behoben ; siehe dieses Update .
Es gibt jedoch eine kleine Einschränkung. HEAD ist eine symbolische Referenz, die auf einen Zweig anstatt direkt auf ein Commit verweist. Die git-Fernübertragungsprotokolle melden jedoch nur Commits für Referenzen. Git kennt also die SHA1 des Commits, auf das HEAD und alle anderen Refs hinweisen. Anschließend muss der Wert von HEAD abgeleitet werden, indem ein Zweig gefunden wird, der auf dasselbe Commit verweist. Das heißt, wenn zwei Zweige dorthin zeigen, ist dies nicht eindeutig. (Ich glaube, es wählt nach Möglichkeit den Master aus und greift dann alphabetisch auf den ersten zurück.) Dies wird in der Ausgabe von 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
Obwohl sich der auf diese Weise gedruckte Begriff HEAD ändert, wenn sich die Dinge auf der Fernbedienung ändern (z. B. wenn foo entfernt wird), wird er seltsamerweise nicht aktualisiert refs/remotes/origin/HEAD. Dies kann zu sehr merkwürdigen Situationen führen. Angenommen, im obigen Beispiel hat origin / HEAD tatsächlich auf foo gezeigt, und der foo-Zweig von origin wurde dann entfernt. Wir können dann Folgendes tun:
$ 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)
Obwohl Remote Show weiß, dass HEAD Master ist, wird nichts aktualisiert. Der veraltete foo-Zweig ist korrekt beschnitten, und HEAD baumelt (zeigt auf einen nicht vorhandenen Zweig), und es wird immer noch nicht aktualisiert, um auf den Master zu zeigen. Wenn Sie dies beheben möchten, verwenden Sie git remote set-head origin -a, wodurch der HEAD des Ursprungs wie oben automatisch ermittelt wird, und setzen Sie origin / HEAD dann so, dass er auf den entsprechenden Remote-Zweig verweist.
refs/origin/HEAD. Es geht nicht darum, wie die eigene symbolische Referenz eines RepositorysHEADfestgelegt wird.