Warum wird "origin / HEAD" angezeigt, wenn "git branch -r" ausgeführt wird?

160

Wenn du rennst, git branch -rwarum werden die Flammen aufgelistet origin/HEAD? Zum Beispiel gibt es auf GitHub ein Remote-Repo mit zwei Zweigen: Master und Awesome-Feature. Wenn ich es git clonenehme und dann in mein neues Verzeichnis gehe und die Zweige aufführe, sehe ich Folgendes:

$ git branch -r
origin/HEAD
origin/master
origin/awesome-feature

Oder in welcher Reihenfolge auch immer (Alpha? Ich fälsche dieses Beispiel, um die Identität eines unschuldigen Repos geheim zu halten). Also, was ist das HEADGeschäft? Ist es das, worauf die letzte Person pushbeim Schieben HEADhingewiesen hat? Wird das nicht immer das sein, was sie herausgebracht haben push? HEADs bewegen sich ... warum kümmert es mich, auf was jemand HEADauf einer anderen Maschine zeigt?

Ich habe gerade die Fernverfolgung und so in den Griff bekommen, also ist dies eine anhaltende Verwirrung. Vielen Dank!

BEARBEITEN: Ich hatte den Eindruck, dass dedizierte Remote-Repos (wie GitHub, bei dem niemand diesen Code einschaltet und bearbeitet, sondern nur zieht oder drückt usw.) keinen KOPF hatten und nicht haben sollten, weil es im Grunde genommen einen gab. keine Arbeitskopie. Nicht so?

Ben Hamill
quelle

Antworten:

140

@robinst ist korrekt.

In git können Sie auswählen, welcher Zweig standardmäßig ausgecheckt ist (dh wann Sie klonen). Standardmäßig origin/HEADwird darauf hingewiesen.

Auf GitHub können Sie dies in den Admin-Einstellungen für Ihr GitHub-Repo ändern . Sie können dies auch über die Befehlszeile über tun

git remote set-head origin trunk

oder ganz löschen über

git remote set-head origin -d

Beispiel . Sehen Sie sich das Dropdown-Menü "Zweige wechseln" an. trunkwird geprüft, so origin/HEADfolgt trunk.

cdunn2001
quelle
Ich habe eine andere Fernbedienung in umbenannt originund meine hat otherremote/HEAD -> mastermich gestört. Das Ausführen Ihres Befehls hat das für mich behoben.
Felipe Alvarez
59

Der Grund, warum ein nacktes Repository einen HEAD haben kann, besteht darin, dass bestimmt wird, welcher Zweig nach einem Klon des Repositorys zunächst ausgecheckt wird.

Normalerweise zeigt HEAD auf master, und dies ist der Zweig, der ausgecheckt wird, wenn Benutzer das Repository klonen. Wenn Sie es auf einen anderen Zweig setzen (indem Sie HEAD im Bare-Repository bearbeiten), wird dieser Zweig beim Klonen ausgecheckt.

robinst
quelle
2
Ist origin/HEADeine lokale Referenz korrekt, da es möglich ist, diese Referenz zu entfernen, ohne sie zu drücken ? Hat das Entfernen Auswirkungen auf origin?
Zach Posten
@zposten: Nein, genauso wie das Löschen origin/masterdie Fernbedienung nicht beeinflusst.
Robinst
Das würde bedeuten, dass die Referenz nach dem Klonen nur eine nutzlose Information ist.
Bachsau
@Bachsau die Referenz wird nicht geklont.
Robinst
27

Ich hatte den Eindruck, dass dedizierte Remote-Repos (wie GitHub, bei dem niemand in diesen Code eindringt und daran arbeitet, sondern nur zieht oder drückt usw.) keinen KOPF haben und nicht haben sollten, weil im Grunde genommen nichts funktionierte Kopieren. Nicht so?

Ich hatte genau den gleichen Eindruck wie du gesagt hast.

Und ich kann diesen von github geklonten Ursprungs- / HEAD-Fernverfolgungszweig nicht einmal löschen, indem ich dies tue

git branch -d -r origin/HEAD

Dies hatte keine Wirkung.

Kann mir jemand sagen, wie ich diesen Ursprungs- / HEAD-Fernverfolgungszweig löschen kann?

aktualisieren

Obwohl ich nicht herausgefunden habe, warum beim Klonen von Github ein Ursprung / KOPF erstellt wurde, finde ich einen Weg, ihn zu löschen.

Die neue Version von Git bieten

git remote set-head <name> -d

um den nutzlosen HEAD-Zeiger des Remote-Tracking-Zweigs zu löschen.

Und wir können auch den dummen Standardnamen 'origin' in den gewünschten Namen ändern

git remote rename origin <new_name>

Hoffe das kann helfen. :) :)

Boblu
quelle
Ich habe das gleiche Problem (sogar auf GitHub) und Set-Head hat nicht funktioniert. Sollte ich 'git remote set-head HEAD -d' ausführen?
Joost Schuur
5
@ Joost: Es istgit remote set-head origin -d
ZnQ
13

Sie haben Recht, dass das Pushen auf dedizierte Remote-Repos viel besser funktioniert, wenn sie "nackt" sind, dh wenn sie keine Arbeitsverzeichnisse haben. Die Architektur von Git ist für die Aktualisierung durch Patches oder pull( fetch) konzipiert, was in einem verteilten VCS sinnvoll ist. Wie in den Dokumenten irgendwo angegeben, kann das Verschieben in einen Zweig, der gerade ausgecheckt ist, zu "unerwarteten Ergebnissen" führen .

Der HEAD ist Teil der Anforderungen für ein gültiges Repository. Git Repository Layout sagt teilweise:

HEAD

A symref (see glossary) to the refs/heads/ namespace describing the currently active  
branch. It does not mean much if the repository is not associated with any working tree  
(i.e. a bare repository), but a valid git repository must have the HEAD file; some  
porcelains may use it to guess the designated "default" branch of the repository  
(usually master). It is legal if the named branch name does not (yet) exist.

Sie werden HEAD also als Teil der Branchenliste sehen, auch wenn "es nicht viel bedeutet ...".

Paul
quelle
Das macht keinen Sinn. Repositorys beginnen leer, aber sobald Sie etwas an sie senden, sind sie nicht mehr leer. Wenn Sie "git branch" auf ihnen ausführen, wird ein aktuell ausgecheckter Zweig angezeigt.
Geoidesic
@geoidesic Ein Repository kann leer sein, selbst wenn Sie darauf verschoben haben. Folgendes: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config --global user.email "[email protected]"; git config --global user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.baregibt true aus. Außerdem gibt es bei diesen Befehlen keine Arbeitskopie der Push-Datei im Foobar-Repo.
Anders Lindén
@geoidesic Ein Repository kann leer sein, selbst wenn Sie darauf verschoben haben. Folgendes: mkdir foobar; cd foobar; git init --bare; cd ..; git clone foobar foobar_clone; cd foobar_clone; touch file; git add file; git config user.email "[email protected]"; git config user.name "Your Name"; git commit -m "test"; git push origin master; cd ..; cd foobar; git config core.baregibt true aus. Außerdem gibt es bei diesen Befehlen keine Arbeitskopie der Push-Datei im Foobar-Repo.
Anders Lindén
@geoidesic Ein --bare Git-Repo bedeutet nur ein Repo ohne Arbeitsbaum, dh ein Repo, das nur ein .git-Verzeichnis enthält, aber überhaupt keine ausgecheckten Dateien haben kann. Da es keine ausgecheckten Dateien haben kann, hat es nicht einmal ein .git-Verzeichnis, sondern legt einfach alle .git-Dateien direkt im Hauptverzeichnis ab. Erstellen Sie eine und Sie werden sehen!
00prometheus
5

Wenn "origin" ein Remote-Repository ist, identifiziert origin / HEAD den Standardzweig in diesem Remote-Repository.

Beispiel:

$ git remote show
origin
$ git remote show origin
* remote origin
  Fetch URL: [email protected]:walkerh/pipe-o-matic.git
  Push  URL: [email protected]:walkerh/pipe-o-matic.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

Beachten Sie die Zeile "HEAD branch: master". Hier teilt das Remote-Repository den Clients mit, welcher Zweig standardmäßig ausgecheckt werden soll.

Walker Hale IV
quelle
1

Es gibt immer einen Kopf, die Punkte auf den aktuell ausgecheckt Zweig auf dem Remote - Repo (was kann oder auch Master nicht sein). Sogar Remote-Repositorys haben aktuelle Zweige. Normalerweise ist es Meister, und ich kann mir keinen Grund vorstellen, warum man es ändern möchte, aber es kann geändert werden.

codelogic
quelle
2
Github-Repos haben keine Zweige ausgecheckt. Ich verstehe nicht, warum dies zutreffen würde.
Dustin
Remote-Repositorys sollten KEIN Arbeitsverzeichnis haben. Remote-Repositorys sollten --bar sein und können daher keinen aktuell ausgecheckten Zweig haben.
n4rzul
-14

Ich vermute, dass jemand einen Ast geschoben und ihn HEAD genannt hat:

git push origin HEAD
Dustin
quelle
Kann ich einige Kommentare dazu bekommen, was daran falsch ist? Wenn Sie einen Ursprung / KOPF auf Github wollen, ist dies der einzige Weg, den ich kenne, um ihn dorthin zu bringen.
Dustin
Der Remote-HEAD ist eine symbolische Referenz (normalerweise für Refs / Heads / Master). Sie ersetzen die symbolische Referenz durch die Hash-ID des Commits Ihres aktuellen Zweigs.
Daniel Fanjul
2
Sollten Vermutungen nicht in Kommentaren diskutiert werden, anstatt eine ungenaue Antwort zu sein?
Luciano