In der Git-Dokumentation stehen Dinge wie
Der Zweig muss vollständig in HEAD zusammengeführt werden.
Aber was ist Git HEAD
genau?
In der Git-Dokumentation stehen Dinge wie
Der Zweig muss vollständig in HEAD zusammengeführt werden.
Aber was ist Git HEAD
genau?
Sie können sich den HEAD als den "aktuellen Zweig" vorstellen. Wenn Sie den Zweig mit git checkout
wird die HEAD-Revision so geändert, dass sie auf die Spitze des neuen Zweigs zeigt.
Sie können sehen, worauf HEAD hinweist, indem Sie es tun:
cat .git/HEAD
In meinem Fall lautet die Ausgabe:
$ cat .git/HEAD
ref: refs/heads/master
Es ist möglich, dass HEAD auf eine bestimmte Revision verweist, die nicht mit einem Zweignamen verbunden ist. Diese Situation wird als abgetrennter KOPF .
Um zu zitieren andere Menschen :
Ein Kopf ist einfach ein Verweis auf eine Commit-Objekt. Jeder Kopf hat einen Namen (Zweigname oder Tag-Name, usw.). Durch gibt es standardmäßig einen Kopf in jedem Repository einen Kopf namens master. Ein Repository kann eine beliebige Anzahl von Köpfen enthalten. Unter einem bestimmten Zeitpunkt wird ein Kopf als als "aktueller Kopf" ausgewählt. Dieser Kopf ist alias HEAD, immer in Großbuchstaben".
Beachten Sie diesen Unterschied: ein "Kopf" (Kleinbuchstaben) bezieht sich auf einen der benannten Köpfe im Repository; "HEAD" (Großbuchstaben) bezieht sich ausschließlich auf den derzeit aktiven Kopf. Diese Unterscheidung wird häufig in der Git Dokumentation verwendet.
Eine weitere gute Quelle, die schnell das Innenleben von git (und damit ein besseres Verständnis von heads/HEAD) abdeckt, finden Sie unter aquí . Referenzen (ref:) oder Köpfe oder Zweige können wie Post-it-Zettel betrachtet werden, die auf Commits im Commit-Verlauf geklebt werden. Normalerweise zeigen sie auf die Spitze einer Reihe von Commits, aber sie können mit git checkout
o git reset
usw.
In einigen dieser Antworten steckt ein vielleicht subtiles, aber wichtiges Missverständnis. Ich dachte, ich füge meine Antwort hinzu, um sie aufzuklären.
Was ist
HEAD
?
HEAD
ist ein symbolischer Verweis, der darauf verweist, wo Sie sich in Ihrer Commit-Historie befinden. Sie folgt Ihnen wie ein Schatten, wohin Sie auch gehen und was Sie auch tun. Wenn Sie einen Commit machen, HEAD
wird sich bewegen. Wenn Sie etwas auschecken, HEAD
wird sich bewegen. Was auch immer Sie tun, wenn Sie in Ihrer Commit-Historie an einen neuen Ort umgezogen sind, HEAD
ist mit Ihnen mitgezogen. Um ein weit verbreitetes Missverständnis auszuräumen: Sie können sich nicht loslösen von HEAD
. Das ist nicht das, was ein losgelöster HEAD-Staat ist. Wenn Sie sich jemals dabei ertappen, wie Sie denken: "Oh nein, ich bin im losgelösten KOPF-Zustand! Ich habe meinen KOPF verloren!" Erinnere dich daran, dass es dein KOPF ist. Der KOPF bist du. Du hast dich nicht vom KOPF losgelöst, du und dein KOPF haben sich von etwas anderem losgelöst.
HEAD
kann auf einen Commit verweisen, ja, aber normalerweise tut es das nicht. Lassen Sie mich das noch einmal sagen. Typischerweise HEAD
verweist nicht auf eine Übertragung. Er verweist auf eine Verzweigungsreferenz. Er ist beigefügt zu diesem Zweig, und wenn Sie bestimmte Dinge tun (z.B., commit
o reset
), bewegt sich der angehängte Zweig mit HEAD
. Wenn Sie unter die Motorhaube schauen, können Sie sehen, worauf die Anzeige hinweist.
cat .git/HEAD
In der Regel erhalten Sie etwa die folgende Meldung:
ref: refs/heads/master
Manchmal erhält man so etwas wie diese Meldung:
a3c485d9688e3c6bc14b06ca1529f0e78edd3f86
Das passiert, wenn HEAD
verweist direkt auf eine Übertragung. Dies nennt man einen abgetrennten HEAD, weil HEAD
auf etwas anderes als eine Verzweigungsreferenz verweist. Wenn Sie in diesem Zustand eine Übergabe machen, master
die nicht mehr mit der HEAD
wird nicht mehr mit Ihnen mitziehen. Es spielt keine Rolle, wo diese Verpflichtung besteht. Sie könnten auf demselben Commit wie Ihr Master-Zweig sein, aber wenn HEAD
auf die Übergabe und nicht auf den Zweig verweist, wird er abgetrennt und eine neue Übergabe wird nicht mit einem Verweis auf den Zweig verbunden.
Sie können dies grafisch darstellen, indem Sie die folgende Übung durchführen. Führen Sie dies in einem Git-Repository aus. Sie werden ein leicht verändertes Ergebnis erhalten, aber die wichtigsten Teile werden vorhanden sein. Wenn es an der Zeit ist, den Commit direkt auszuchecken, verwenden Sie einfach den abgekürzten Hash, den Sie von der ersten Ausgabe erhalten (hier ist es a3c485d
).
git checkout master
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD -> master)
git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD, master)
OK, hier gibt es also einen kleinen Unterschied in der Ausgabe. Wenn wir den Commit direkt auschecken (statt den Branch), erhalten wir ein Komma statt eines Pfeils. Was denken Sie, befinden wir uns in einem abgetrennten HEAD-Status? HEAD bezieht sich immer noch auf eine bestimmte Revision, die mit einem Zweignamen verbunden ist. Wir sind immer noch auf den Hauptzweig, nicht wahr?
Versuchen Sie es jetzt:
git status
# HEAD detached at a3c485d
Nö. Wir befinden uns im Zustand des "abgetrennten Kopfes".
Sie können die gleiche Darstellung von (HEAD -> branch)
vs. (HEAD, branch)
con git log -1
.
HEAD
bist du. Es zeigt auf das, was Sie überprüft haben, wo immer Sie sind. Normalerweise ist das kein Commit, sondern ein Branch. Wenn HEAD
tut auf einen Commit (oder Tag) zeigen, auch wenn es derselbe Commit (oder Tag) ist, auf den auch ein Branch zeigt, können Sie (und HEAD
) sind von diesem Zweig abgetrennt worden. Da Sie keinen Zweig haben, der mit Ihnen verbunden ist, folgt der Zweig Ihnen nicht, wenn Sie neue Übertragungen vornehmen. HEAD
wird jedoch.
HEAD ist nur ein spezieller Zeiger, der auf den lokalen Zweig zeigt, in dem Sie sich gerade befinden.
Von der Pro Git Buch, Kapitel 3.1 Git-Verzweigungen - Verzweigungen in Kurzform in dem Abschnitt Einen neuen Zweig erstellen :
Was passiert, wenn Sie einen neuen Zweig erstellen? Nun, dadurch wird ein neuer Zeiger, den Sie herumbewegen können. [ ] namens testing. Sie tun dies mit dem Befehl git branch:
$ git branch testing
Dies erzeugt einen neuen Zeiger auf denselben Commit, auf dem Sie sich gerade befinden
Woher weiß Git, in welchem Zweig Sie sich gerade befinden? Es behält einen speziellen Zeiger namens HEAD. Beachten Sie, dass dies etwas ganz anderes ist als das Konzept von HEAD in anderen VCS, die Sie vielleicht kennen, wie Subversion oder CVS. In Git ist dies ein Zeiger auf den lokalen Zweig in dem Sie sich gerade befinden. In diesem Fall befinden Sie sich immer noch auf master. Der Befehl git branch-Befehl hat nur einen neuen Zweig erzeugt - er hat nicht zu diesem Zweig.
Ich empfehle diese Definition von Github-Entwickler Scott Chacon [ Video-Referenz ]:
Leiter ist Ihre derzeitige Niederlassung. Er ist eine symbolische Referenz. Er ist ein Verweis auf einen Zweig. Sie haben immer HEAD, aber HEAD zeigt auf einen dieser anderen Zeiger, auf einen der Zweige, in denen Sie sich befinden. Es ist der Elternteil Ihrer nächsten Übertragung. Es sollte das sein, was zuletzt in Ihr Arbeitsverzeichnis ausgecheckt wurde... Dies ist der letzte bekannte Stand Ihres Arbeitsverzeichnisses.
Das ganze Video gibt eine gute Einführung in das gesamte Git-System, daher empfehle ich Ihnen, es sich ganz anzusehen, wenn Sie die Zeit dazu haben.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.