Ich habe einen Zweig eingerichtet, um einen Ref im Ursprung zu verfolgen. git checkout <branchname>
wechselt zu diesem Zweig, und ein git status
Wille zeigt mir, wie weit vor oder hinter meinem Zweig der Ursprung liegt, aber ich bin überrascht, dass er origin/HEAD
immer noch auf origin/master
zeigt und nichtorigin/<branchname>
Meine Frage ist also, unter welchen Umständen wird Ursprung / KOPF bewegt?
BEARBEITEN:
Ich schätze die Antworten, wie man Herkunft / KOPF bewegt, aber ich bin daran interessiert, was "organisch" es bewegt, ohne dass ich es ausdrücklich dazu auffordere.
Wenn ich zum Beispiel einen Zweig wechsle, zeigt git HEAD auf den Zweig, den ich auschecke, und ich bin überrascht, dass sich origin / HEAD nicht auf die gleiche Weise bewegt.
refs/origin/HEAD
. Es geht nicht darum, wie die eigene symbolische Referenz eines RepositorysHEAD
festgelegt wird.Antworten:
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
master
undorigin/master
in Ihrem Repo, woorigin/master
eine lokale Kopie desmaster
Zweigs 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
: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: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.quelle
git remote set-head origin -a
hat den Job für mich gemachtDies ist Ihre Einstellung als Eigentümer Ihres lokalen Repos. Ändern Sie es so:
Und origin / HEAD zeigt auf Ihren Zweig anstatt auf den Master. Dies würde dann nur für Ihr Repo gelten und nicht für andere. Standardmäßig zeigt es auf Master, es sei denn, auf dem Remote-Repo wurde etwas anderes konfiguriert.
Die manuelle Eingabe für den Fernbedienungskopf bietet hierzu einige gute Informationen.
Bearbeiten: um zu betonen: Ohne dass Sie es sagen, wäre der einzige Weg, wie es sich "bewegen" würde, ein Fall wie das Umbenennen des Hauptzweigs , der meiner Meinung nach nicht als "organisch" angesehen wird. Also, ich würde sagen, organisch bewegt es sich nicht.
quelle
Was bewegt Ursprung / KOPF "organisch"?
git clone
Setzt es einmal auf die Stelle, an der sich HEAD befindetgit clone
Was bedeutet HEAD on Origin?
git clone
es so verwendet wirdWas setzt Ursprung / KOPF?
git clone
holt und setzt esgit fetch
es wie jede andere Referenz aktualisiert würde , aber nichtgit remote set-head origin -a
holt und setzt esWissenswertes
origin/HEAD
kann auch auf einen anderen Wert eingestellt werden, ohne die Fernbedienung zu kontaktieren:git remote set-head origin <branch>
quelle
origin/HEAD
und Ihre Lösung half. Vielen Dank!git fetch
Aktualisierung nicht einverstanden , da damit eine (lokale) Verknüpfung konfiguriert werden kann. Zitieren des Dokuments: "Ein Standardzweig für eine Fernbedienung ist nicht erforderlich, ermöglicht jedoch die Angabe des Namens der Fernbedienung anstelle einer bestimmten Verzweigung." Es wäre seltsam, wenn eine Remote-Änderung lokal konfigurierte Verknüpfungen aktualisieren würde.origin/HEAD
ist ein schlechter Name. Und dasgit clone
widerspricht auch einem Remote-Namen als Standard für einen „lokal konfigurierten Zweig“. In nicht nackten Repositorys ist es nicht einmal sinnvoll, den Strom der Fernbedienung zu verwendenHEAD
.Haftungsausschluss : Dies ist ein Update von Jefromis Antwort , die ich schreibe, um den Neugierigen etwas Zeit zu sparen.
Ich habe vergeblich versucht, (in Git 2.0.1) die
remote HEAD is ambiguous
Nachricht zu replizieren , die Jefromi in seiner Antwort erwähnt; Also habe ich ein bisschen gegraben (indem ich https://github.com/git/git geklont und das Protokoll durchsucht habe). Früher war es das(Commit
4229f1fa325870d6b24fe2a4c7d2ed5f14c6f771
vom 27. Februar 2009, gefunden mitgit log --reverse --grep="HEAD is ambiguous"
)Die fragliche Mehrdeutigkeit wurde jedoch inzwischen aufgehoben :
(Commit
9196a2f8bd46d36a285bdfa03b4540ed3f01f671
vom 8. November 2013, gefunden mitgit log --grep="ambiguous" --grep="HEAD" --all-match
)Bearbeiten (danke an torek ):
Dies bedeutet, dass Sie bei Verwendung von Git v1.8.4.3 oder höher nicht auf ein mehrdeutiges Remote-HEAD-Problem stoßen sollten.
quelle
Denken Sie daran, es gibt zwei unabhängige Git-Repos, über die wir sprechen. Ihr lokales Repo mit Ihrem Code und der Fernbedienung, die woanders ausgeführt wird.
Sie haben Recht, wenn Sie einen Zweig wechseln, zeigt HEAD auf Ihren aktuellen Zweig. All dies geschieht auf Ihrem lokalen Git-Repo. Nicht das Remote-Repo, das einem anderen Entwickler gehören könnte oder sich auf einem Server in Ihrem Büro oder Github oder einem anderen Verzeichnis im Dateisystem befindet, oder so weiter.
Ihr Computer (lokales Repo) hat nichts damit zu tun, den HEAD-Zeiger auf dem Remote-Git-Repo zu ändern. Es könnte beispielsweise einem anderen Entwickler gehören.
Eine weitere Sache, die Ihr Computer als origin / XXX bezeichnet, ist das Verständnis Ihres Computers für den Status der Fernbedienung zum Zeitpunkt des letzten Abrufs.
Was würde also "organisch" Origin / HEAD aktualisieren? Es wäre Aktivität auf dem Remote-Git-Repo. Nicht dein lokales Repo.
Die Leute haben erwähnt
Normalerweise wird dies verwendet, wenn auf einem Server ein gemeinsames zentrales Git-Repo zur Verwendung durch das Entwicklungsteam vorhanden ist. Dies wäre ein Befehl, der auf dem Remotecomputer ausgeführt wird. Sie würden dies als Aktivität auf dem Remote-Git-Repo sehen.
quelle
Führen Sie die folgenden Befehle über die Git-CLI aus:
quelle