Frage Was ist KOPF in Git?


Sie sehen die Git-Dokumentation, die Dinge wie sagt

Der Zweig muss vollständig in HEAD zusammengeführt sein.

Aber was ist Git? HEAD genau?


835
2018-02-20 22:58


Ursprung


Antworten:


Sie können sich den HEAD als "aktuellen Zweig" vorstellen. Wenn Sie mit verzweigen git checkoutDie HEAD-Revision ändert sich so, dass sie auf die Spitze des neuen Zweigs zeigt.

Sie können sehen, worauf HEAD verweist, indem Sie Folgendes tun:

cat .git/HEAD

In meinem Fall ist die Ausgabe:

$ cat .git/HEAD
ref: refs/heads/master

Es ist möglich, dass HEAD auf eine bestimmte Revision verweist, die keinem Zweignamen zugeordnet ist. Diese Situation heißt a Abgetrennter Kopf.


618
2018-02-20 23:00



Zitieren andere Leute:

Ein Kopf ist einfach ein Verweis auf ein   Objekt committen. Jeder Kopf hat einen Namen   (Name des Zweigs oder Tags, usw.). Durch   Standardmäßig gibt es in jedem einen Kopf   Repository namens Master. Ein Repository   kann eine beliebige Anzahl von Köpfen enthalten. Beim   Zu gegebener Zeit wird ein Kopf ausgewählt   als der "aktuelle Kopf". Dieser Kopf ist   Alias ​​zu HEAD, immer in Großbuchstaben ".

Beachten Sie diesen Unterschied: ein "Kopf"   (Kleinbuchstaben) bezieht sich auf eine der   benannte Köpfe im Repository; "KOPF"   (Großbuchstaben) bezieht sich ausschließlich auf die   derzeit aktiver Kopf. Dies   Unterscheidung wird häufig in Git verwendet   Dokumentation.

Eine andere gute Quelle, die schnell das Innenleben von Git (und damit ein besseres Verständnis von Köpfen / HEAD) abdeckt, kann gefunden werden Hier. Referenzen (ref :) oder Köpfe oder Zweige können wie Post-It-Notizen betrachtet werden, die im Commit-Verlauf festgeschrieben werden. Normalerweise zeigen sie auf den Tipp einer Reihe von Commits, aber sie können mit verschoben werden git checkout oder git revert etc.


143
2017-12-07 21:03



Ich empfehle diese Definition von Github-Entwickler Scott Chacon [Videoreferenz]:

Head ist dein aktueller Zweig. Es ist eine symbolische Referenz. Es ist ein Verweis auf eine Verzweigung. Du hast immer HEAD, aber HEAD wird auf einen dieser anderen Zeiger zu einem der Zweige zeigen, auf dem du gerade bist. Es ist das Elternteil Ihres nächsten Commit. Es sollte das sein, was zuletzt in Ihrem Arbeitsverzeichnis ausgecheckt wurde ... Dies ist der letzte bekannte Zustand Ihres Arbeitsverzeichnisses.

Das ganze Video wird eine gute Einführung in das gesamte Git-System geben, daher empfehle ich Ihnen auch, alles zu sehen, wenn Sie Zeit dazu haben.


44
2017-08-26 15:01



HEAD ist nur ein spezieller Zeiger, der auf den lokalen Zweig zeigt, auf dem Sie sich gerade befinden.

Von dem Pro Git Buchkapitel 3.1 Git Branching - Branchen in Kürze, im Bereich Erstellen eines neuen Zweiges:

Was passiert, wenn Sie einen neuen Zweig erstellen? Nun, das schafft ein neues   Zeiger für Sie, um sich zu bewegen. Nehmen wir an, Sie erstellen einen neuen Zweig   Tests genannt. Sie tun dies mit dem git-Verzweigungsbefehl:

$ git branch testing 

Dies erzeugt einen neuen Zeiger bei demselben Commit, an dem Sie gerade arbeiten

enter image description here

Woher weiß Git, in welchem ​​Zweig Sie gerade sind? Es hält einen speziellen Zeiger namens HEAD. Beachten Sie, dass dies viel anders ist als   das Konzept von HEAD in anderen VCS, die Sie vielleicht gewohnt sind, wie   Subversion oder CVS. In Git ist dies ein Zeiger auf den lokalen Zweig   Du bist gerade angemeldet. In diesem Fall sind Sie immer noch Master. Der Idiot   Der Branch-Befehl hat nur einen neuen Zweig erstellt - es wurde nicht darauf umgeschaltet   Ast.

enter image description here


35
2018-03-09 20:02



Angenommen, es handelt sich nicht um einen speziellen Fall, der "losgelöster HEAD" genannt wird, wie im Buch O'Reilly Git, 2. Auflage, S.69, HEAD meint:

HEAD bezieht sich immer auf den letzten Commit auf dem aktuellen   Ast. Wenn Sie Filialen wechseln, HEAD wird aktualisiert, um auf das Neue zu verweisen   das neueste Commit der Branche.

damit

HEAD ist die "Spitze" der aktuellen Branche.

Beachten Sie, dass wir verwenden können HEAD auf den letzten Commit verweisen und verwenden HEAD~ als das Commit vor dem Trinkgeld, und HEAD~~ oder HEAD~2 als das Commit noch früher, und so weiter.


26
2018-05-06 09:37



HEAD bezieht sich auf das aktuelle Commit, auf das Ihre Arbeitskopie verweist, d. h. das Commit, das Sie gerade ausgecheckt haben. Von dem offizielle Linux-Kernel-Dokumentation zum Festlegen von Git-Revisionen:

HEAD Benennt das Commit, auf dem die Änderungen im Arbeitsbaum basieren.

Beachten Sie jedoch, dass in der kommenden Version 1.8.4 von Git, @ kann auch als Kurzschrift verwendet werden HEAD, wie bemerkt von Git-Mitwirkender Junio ​​C Hamano in seinem Git Blame Blog:

Anstatt "HEAD" einzugeben, können Sie stattdessen "@" sagen, z. "git log @".

Stack Overflow-Benutzer VonC fand auch einige interessante Informationen zu Warum @ wurde als Kürzel in seiner Antwort auf eine andere Frage gewählt.

Interessant ist auch, dass es in manchen Umgebungen nicht notwendig ist, Kapital zu schlagen HEAD, speziell in Betriebssystemen, bei denen die Groß- und Kleinschreibung nicht berücksichtigt wird, insbesondere Windows und OS X.


17
2017-07-26 01:18



Sieh dir das an Erstellen und spielen mit Zweigen

HEAD ist eigentlich eine Datei, deren Inhalt bestimmt, wo sich die HEAD-Variable bezieht:

$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed

In diesem Repository bezieht sich der Inhalt der HEAD-Datei auf eine zweite Datei namens Referenzen / Köpfe / Master. Die Datei Referenzen / Köpfe / Master enthält den Hash des letzten Commits auf dem Master-Zweig.

Das Ergebnis ist HEAD zeigt auf den Master-Zweig Commit von der .git / refs / heads / master Datei.

enter image description here


12
2017-12-09 07:20



Ich möchte nur ein paar Dinge in Greg Hewgils akzeptierter Antwort aufführen. Entsprechend der Git Taschenführer

Ast:

Der Zweig selbst ist definiert als alle Punkte, die beim Commit erreichbar sind   Graph aus dem benannten Commit (die "Spitze" der Verzweigung).

KOPF: Eine spezielle Art von Ref

Der spezielle Ref HEAD legt fest, in welchem ​​Zweig Sie sich befinden ...

Refs

Git definiert zwei Arten von Referenzen oder benannte Zeiger, die es aufruft   "Referenzen":

  • Ein einfacher Verweis, der direkt auf eine Objekt-ID verweist (normalerweise ein Commit oder ein Tag)
  • Ein symbolischer Verweis (oder Symref), der auf einen anderen Verweis verweist (entweder einfach oder symbolisch)

Wie Greg erwähnte, kann HEAD in einem "gelösten Zustand" sein. So kann HEAD entweder ein einfacher Verweis (für einen abgetrennten HEAD) oder ein Symref sein.

Wenn HEAD eine symbolische Referenz für einen bestehenden Zweig ist, dann sind Sie "on"   dieser Zweig. Wenn HEAD dagegen ein einfacher Verweis ist   Benennen Sie ein Commit durch seine SHA-1 ID, dann sind Sie nicht auf einem Zweig, aber   eher im "losgelöste HEAD" -Modus, was passiert, wenn Sie einige auschecken   früher begehen zu untersuchen.


8
2017-08-05 16:04



Ich denke, HEAD ist das aktuelle Check-out-Commit. Mit anderen Worten: "HEAD" zeigt auf das aktuell ausgecheckte Commit.

Wenn Sie gerade geklont und nicht ausgecheckt haben, weiß ich nicht, worauf es hinweist, wahrscheinlich einen ungültigen Ort.


4
2017-07-18 09:57



Ein guter Weg, um den Punkt in den richtigen Antworten nach Hause zu fahren, ist zu laufen git reflog HEAD, Sie erhalten eine Geschichte von allen Orten, auf die HEAD hingewiesen hat.


3
2018-05-12 19:27



Nachdem ich alle vorherigen Antworten gelesen hatte, wollte ich noch mehr Klarheit. Dieser Blog auf der offiziellen git Webseite http://git-scm.com/blog gab mir, wonach ich gesucht hatte:

Der HEAD: Zeiger zum letzten Commit-Snapshot, nächster Elternteil

Der Kopf in Git ist der Zeiger an den aktuellen Zweig Referenz, die wiederum ein ist Zeiger bis zum letzten Commit, den Sie gemacht haben, oder dem letzten Commit, der in Ihr Arbeitsverzeichnis ausgecheckt wurde. Das bedeutet auch, dass es das Elternteil des nächsten Commits sein wird, das Sie tun. Es ist im Allgemeinen am einfachsten, es als HEAD zu betrachten, da dies der Snapshot Ihres letzten Commits ist.


3
2017-09-26 08:03