Sie können sich den HEAD als "aktuellen Zweig" vorstellen. Wenn Sie Zweige mit wechseln git checkout, ändert sich die HEAD-Revision so, dass sie auf die Spitze des neuen Zweigs zeigt.
Sie können sehen, worauf HEAD zeigt, indem Sie Folgendes tun:
cat .git/HEAD
In meinem Fall lautet die Ausgabe:
$ cat .git/HEAD
ref: refs/heads/master
HEAD kann auf eine bestimmte Revision verweisen, die keinem Zweigstellennamen zugeordnet ist. Diese Situation wird als losgelöster KOPF bezeichnet .
Git HEAD ist also kontextabhängig von dem Zweig, auf dem Sie sich befinden, richtig? Noch weiter, Sie als Entwickler? Ich frage mich wohl, ob Git HEAD eine repository-weite globale Sache sein wird oder individuell für jeden Entwickler?
Bobobobo
91
@bobobobo: Richtig, HEAD ist wie ein Zeiger, der auf den aktuellen Zweig zeigt. Wenn Sie einen anderen Zweig auschecken, ändert HEAD auf den neuen. Der aktuelle HEAD ist lokal für jedes Repository und daher für jeden Entwickler individuell.
@ 動靜 能量: HEAD kann auf ein Commit verweisen , es muss nicht das letzte Commit in einem Zweig sein. (Wenn HEAD auf ein Commit zeigt, das nicht das letzte Commit in einem Zweig ist, handelt es sich um einen "getrennten HEAD").
Greg Hewgill
127
HEAD ist nicht "der aktuelle Zweig". Is ist der Name für das Commit, von dem aus der aktuelle Status des Arbeitsbaums initialisiert wurde. In der Praxis kann es als symbolischer Verweis auf das ausgecheckte Commit angesehen werden.
Ein Kopf ist einfach eine Referenz auf ein Festschreibungsobjekt. Jeder Kopf hat einen Namen (Filialname oder Tag-Name usw.). Standardmäßig befindet sich in jedem Repository ein Kopf namens master. Ein Repository kann eine beliebige Anzahl von Köpfen enthalten. Zu jedem Zeitpunkt wird ein Kopf als "aktueller Kopf" ausgewählt. Dieser Kopf ist auf HEAD ausgerichtet, immer in Großbuchstaben. "
Beachten Sie diesen Unterschied: Ein „Kopf“ (Kleinbuchstaben) bezieht sich auf einen der genannten Köpfe im Repository. "HEAD" (Großbuchstaben) bezieht sich ausschließlich auf den aktuell 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 Köpfen / KOPF) abdeckt, finden Sie hier . Verweise (Ref. :) oder Köpfe oder Zweige können als Haftnotizen betrachtet werden, die auf Commits im Commit-Verlauf geklebt sind. Normalerweise zeigen sie auf die Spitze einer Reihe von Commits, aber sie können mit git checkoutoder git resetusw. verschoben werden .
Daraus: "Jeder Kopf hat einen Namen". Und "ein Kopf wird als" aktueller Kopf "ausgewählt. Dieser Kopf ist auf HEAD ausgerichtet ". Daraus schließe ich, dass sich "HEAD" nicht auf die Situation des "losgelösten HEAD" -Zustands bezieht.
Gxyd
1
@gxyd Wenn HEAD nicht auf einen 'Kopf' zeigt, handelt es sich um einen abgetrennten HEAD. Es zeigt auf die Festschreibungs-ID des von Ihnen angegebenen Festschreibungsvorgangs (z. B. mit git checkout HEAD~2), bei der es sich nicht um die Festschreibungs-ID eines bekannten Kopfes handelt. Eine ausführlichere Erklärung finden Sie im Artikel unter eagain.net/articles/git-for-computer-scientists .
Silfheed
1
@Silfheed: Im Allgemeinen denke ich, dass diese Antwort konzeptionell fundierter ist als die akzeptierte (obwohl die Verwendung von Kleinbuchstaben "Kopf", um auf einen Zweig zu verweisen, viele Menschen verwirrt). Dies git revertist jedoch kein gutes Beispiel für das Verschieben eines Zweigs, um nicht an der Spitze zu sein, da git revertnur einige neue Commits erstellt werden und der aktuelle Zweig weiterhin an der (neuen) Spitze verbleibt.
LarsH
1
„das ist nicht der Commit - ID eines bekannten Kopf“ - Eigentlich ein abgetrenntes HEAD kann auf eine ID begehen zeigen, die auch ID eines bekannten Kopf der Commit (oder mehrere Köpfe). Was es losgelöst macht, ist, dass der HEAD direkt auf die Commit-ID zeigt, nicht auf einen Kopf. Dies wird das Verhalten zukünftiger commits, resets usw. beeinflussen.
LarsH
1
@LarsH: Guter Punkt auf einem abgetrennten HEAD, der auf eine Commit-ID anstelle einer Referenz zeigt. Sie können dies tatsächlich überprüfen, indem Sie sich .git / HEAD ansehen. Wenn es getrennt ist, enthält es den Hash eines Commits, auch wenn es dasselbe Commit wie ein bekannter Kopf ist. Wenn es angehängt ist, enthält es den Pfad zum Kopf (dh 'ref: refs / Heads / Bob'). Was den Befehl zum Zurücksetzen betrifft, habe ich diesen Tippfehler nach 8 Jahren nie mehr bemerkt. Mit Git Reset können Sie einen bestimmten Kopf so einstellen, dass er auf ein bestimmtes Commit verweist.
Silfheed
62
Ich empfehle diese Definition von Github Entwickler Scott Chacon [ Video - Referenz ]:
Kopf ist Ihre aktuelle Niederlassung. Es ist eine symbolische Referenz. Es ist ein Verweis auf einen Zweig. Sie haben immer HEAD, aber HEAD zeigt auf einen dieser anderen Zeiger, auf einen der Zweige, auf denen Sie sich befinden. Es ist das übergeordnete Element Ihres nächsten Commits. Es sollte das sein, was zuletzt in Ihr Arbeitsverzeichnis eingecheckt wurde ... Dies ist der letzte bekannte Status Ihres Arbeitsverzeichnisses.
Das ganze Video wird eine faire Einführung in das gesamte Git-System geben, daher empfehle ich Ihnen auch, alles anzuschauen, wenn Sie Zeit dazu haben.
Der wahre Def ist also "der Elternteil Ihres nächsten Commits"
Nicole
1
und auch "das Ding, das auf den nächsten Zweig zeigt, der sich bewegen wird"
Nicole
@nicolas - Ich denke nicht , dass das wahr ist. HEAD kann auf ein Commit zeigen, es muss nicht unbedingt auf einen Zweig zeigen - wenn dies nicht der Fall ist, befinden Sie sich im "losgelösten HEAD" -Modus.
Scubbo
23
Das Video ist großartig, aber leider ist es eine ungeeignete Antwort für Stack Overflow. Was ist, wenn das Video irgendwann in der Zukunft entfernt wird? Dann zeigt Ihr Link auf nichts. Eine bessere Antwort wäre eine Abschrift dessen, was Scott im Video sagt.
2
Scott sagt, HEAD ist ein Zeiger auf einen Zweig. HEAD kann aber auch auf alte Commits verweisen. Das ist sooo verwirrend.
Fixee
60
HEAD ist nur ein spezieller Zeiger, der auf den lokalen Zweig verweist, in dem Sie sich gerade befinden.
Was passiert, wenn Sie einen neuen Zweig erstellen? Dadurch wird ein neuer Zeiger erstellt, mit dem Sie sich bewegen können. Angenommen, Sie erstellen einen neuen Zweig namens "Testen". Sie tun dies mit dem Befehl git branch:
$ git branch testing
Dadurch wird ein neuer Zeiger bei demselben Commit erstellt, auf dem Sie sich gerade befinden
Woher weiß Git, in welchem Zweig Sie sich gerade befinden? Es enthält einen speziellen Zeiger namens HEAD. Beachten Sie, dass dies sich stark von dem Konzept von HEAD in anderen VCS unterscheidet, an die Sie möglicherweise gewöhnt sind, z. B. Subversion oder CVS. In Git ist dies ein Zeiger auf den lokalen Zweig, in dem Sie sich gerade befinden. In diesem Fall sind Sie immer noch auf dem Master. Der Befehl git branch hat nur einen neuen Zweig erstellt - er hat nicht zu diesem Zweig gewechselt.
Gute Antwort. Zweige sind nichts anderes als beschriftete Commits. Wenn Sie neue Commits ausführen, wird diese Bezeichnung in das neue neue Commit verschoben. Wenn Sie ein Commit ohne Beschriftung auschecken, befindet es sich im getrennten HEAD-Status. Das bedeutet, dass HEAD auf ein Commit verweist, das keine Verzweigungsbezeichnung hat. Wenn Sie 34ac2im obigen Beispiel auschecken, zeigt HEAD jetzt auf dieses Commit und es wird als getrennter HEAD bezeichnet. In diesem Zustand können Sie auch Änderungen vornehmen, experimentieren und Änderungen festschreiben. Wenn Sie jedoch einen anderen Zweig auschecken, gehen alle Änderungen verloren, es sei denn, Sie erstellen einen neuen Zweig.
sleepwalkerfx
1
@sleepwalkerfx, aber Sie können ein Commit auschecken, das eine Verzweigungsbezeichnung hat und sich immer noch im Status des getrennten Kopfes befindet, da Ihr HEAD nicht mehr auf die Verzweigungsbezeichnung, sondern auf die Festschreibungs-ID der Verzweigung zeigt
Marc
1
@sleepwalkerfx Ich denke, wir sprechen an dieser Stelle über Semantik. Sie haben Recht, eine Verzweigungsbezeichnung ist ein Textverweis auf ein bestimmtes Commit. Es ist jedoch kein Commit. Wenn Sie also ein tat git logund bekam so etwas wie commit ad0265... HEAD -> foo ...das wäre die mittlere fooZweig ist eine Referenz - ID zu begehen ad0265. Das Auschecken der Textreferenz fooist kein losgelöster Kopf. Das Auschecken der Festschreibungs-ID ad0265würde zu einem abgetrennten Kopf führen. Vielleicht fehlt mir etwas Feines von dem, was Sie kommunizieren. Ich hoffe, diese Textwand hilft herauszufinden, wo ich verloren bin.
Marc
40
Unter der Annahme, dass es sich nicht um einen Sonderfall handelt, der als "losgelöster KOPF" bezeichnet wird, bedeutet dies, wie im O'Reilly Git-Buch, 2. Ausgabe, S. 69, angegeben HEAD:
HEADbezieht sich immer auf das letzte Commit für den aktuellen Zweig. Wenn Sie Zweige wechseln, HEADwird aktualisiert, um auf das letzte Commit des neuen Zweigs zu verweisen.
damit
HEADist die "Spitze" des aktuellen Zweigs .
Beachten Sie, dass wir verwenden können HEAD, um auf das letzte Commit zu verweisen und es HEAD~als Commit vor dem Tipp und HEAD~~oder HEAD~2als Commit noch früher usw. zu verwenden.
Es gibt ein vielleicht subtiles, aber wichtiges Missverständnis in einer Reihe dieser Antworten. Ich dachte, ich würde meine Antwort hinzufügen, um es zu klären.
Was ist HEAD?
KOPF bist DU
HEADist eine symbolische Referenz, die darauf verweist, wo immer Sie sich in Ihrem Commit-Verlauf befinden. Es folgt dir, wohin du auch gehst, was auch immer du tust, wie ein Schatten. Wenn Sie ein Commit machen, HEADwird sich bewegen. Wenn Sie etwas auschecken, HEADwird sich bewegen. Was auch immer Sie tun, wenn Sie in Ihrem Commit-Verlauf an einen neuen Ort gezogen sind, HEADist mit Ihnen mitgezogen. Um ein häufiges Missverständnis anzusprechen: Sie können sich nicht davon lösen HEAD. Das ist nicht das, was ein losgelöster HEAD-Zustand ist. Wenn Sie jemals denken: "Oh nein, ich bin in losgelöstem KOPF! Ich habe meinen KOPF verloren!" Denken Sie daran, es ist Ihr Kopf. KOPF bist du. Sie haben sich nicht vom KOPF gelöst, Sie und Ihr KOPF haben sich von etwas anderem gelöst.
Woran kann HEAD anhängen?
HEADkann auf ein Commit verweisen, ja, aber normalerweise nicht. Lassen Sie mich das noch einmal sagen. Verweist HEADnormalerweise nicht auf ein Commit. Es zeigt auf eine Zweigreferenz. Es ist an diesen Zweig angehängt , und wenn Sie bestimmte Dinge tun (z. B. commitoder reset), bewegt sich der angehängte Zweig mit HEAD. Sie können sehen, worauf es zeigt, indem Sie unter die Haube schauen.
cat .git/HEAD
Normalerweise bekommst du so etwas:
ref: refs/heads/master
Manchmal bekommst du so etwas:
a3c485d9688e3c6bc14b06ca1529f0e78edd3f86
Das passiert, wenn HEADdirekt auf ein Commit verwiesen wird. Dies wird als losgelöster HEAD bezeichnet, da HEADer auf etwas anderes als eine Verzweigungsreferenz verweist. Wenn Sie in diesem Status ein Commit durchführen masterund nicht mehr an dieses gebunden sind HEAD, wird es nicht mehr mit Ihnen mitgehen. Es spielt keine Rolle, wo sich dieses Commit befindet. Sie befinden sich möglicherweise im selben Commit wie Ihr Hauptzweig. Wenn Sie HEADjedoch auf den Commit und nicht auf den Zweig verweisen, wird dieser getrennt und ein neuer Commit wird keiner Zweigreferenz zugeordnet.
Sie können dies grafisch betrachten, wenn Sie die folgende Übung versuchen. Führen Sie dies in einem Git-Repository aus. Sie werden etwas anderes bekommen, aber die Schlüsselbits werden da sein. Wenn es Zeit ist, das Commit direkt auszuchecken, verwenden Sie einfach den abgekürzten Hash, den Sie von der ersten Ausgabe erhalten (hier ist er a3c485d).
OK, hier gibt es einen kleinen Unterschied in der Ausgabe. Wenn Sie das Commit direkt (anstelle des Zweigs) auschecken, erhalten Sie ein Komma anstelle eines Pfeils. Was denkst du, sind wir in einem freistehenden HEAD-Zustand? HEAD bezieht sich immer noch auf eine bestimmte Revision, die einem Filialnamen zugeordnet ist. Wir sind immer noch in der Hauptniederlassung, nicht wahr?
Versuchen Sie jetzt:
git status
# HEAD detached at a3c485d
Nee. Wir befinden uns im Status "freistehender KOPF".
Sie können die gleiche Darstellung von (HEAD -> branch)vs. (HEAD, branch)mit sehen git log -1.
Abschließend
HEADbist du Es zeigt auf alles, was Sie ausgecheckt haben, wo immer Sie sind. In der Regel handelt es sich nicht um ein Commit, sondern um einen Zweig. Wenn HEADtut Punkt zu einem Commit (oder Tag), auch wenn es die gleichen commit (oder Tag) , dass ein Zweig auch Punkte, Sie (und HEAD) haben aus diesem Zweig abgelöst worden. Da Ihnen kein Zweig zugeordnet ist, folgt der Zweig Ihnen nicht, wenn Sie neue Commits vornehmen. HEADwird jedoch.
Ich mag diese Antwort, denn während die Dokumentation die Wahrheit beschreibt, definiert die Software die Wahrheit. .git/HEADist das, was die Software als HEAD betrachtet.
Don Branson
2
Dies sollte allein für die konzeptionelle Definition die akzeptierte Antwort sein.
Interessant ist auch, dass in einigen Umgebungen keine Kapitalisierung erforderlich ist HEAD, insbesondere bei Betriebssystemen, bei denen Dateisysteme ohne Berücksichtigung der Groß- und Kleinschreibung verwendet werden, insbesondere Windows und OS X.
In diesem Repository bezieht sich der Inhalt der HEAD-Datei auf eine zweite Datei mit dem Namen refs / Heads / Master . Die Datei refs / Heads / Master enthält den Hash des letzten Commits im Master-Zweig.
Das Ergebnis ist, dass HEAD-Punkte auf das Commit des Master-Zweigs aus der Datei .git / refs / Heads / Master verweisen.
Achtung: Der Link gitguys.com scheint auf eine geparkte Domain zu verweisen.
MKesper
14
Ich möchte nur ein paar Dinge in Greg Hewgils akzeptierter Antwort detailliert beschreiben. Laut Git Pocket Guide
Ast:
Der Zweig selbst ist definiert als alle Punkte, die im Festschreibungsdiagramm vom benannten Festschreiben (der „Spitze“ des Zweigs) aus erreichbar sind.
KOPF: Eine spezielle Art von Ref
Der spezielle Ref HEAD bestimmt, in welchem Zweig Sie sich befinden ...
Refs
Git definiert zwei Arten von Referenzen oder benannten Zeigern, die es "refs" nennt:
Eine einfache Referenz, die direkt auf eine Objekt-ID verweist (normalerweise ein Commit oder Tag).
Eine symbolische Referenz (oder Symref), die auf eine andere Referenz verweist (entweder einfach oder symbolisch)
Wie Greg erwähnte, kann sich HEAD in einem "getrennten Zustand" befinden. HEAD kann also entweder ein einfacher Ref (für einen abgetrennten HEAD) oder ein Symref sein.
Wenn HEAD eine symbolische Referenz für einen vorhandenen Zweig ist, befinden Sie sich in diesem Zweig. Wenn es sich bei HEAD hingegen um einen einfachen Ref handelt, der ein Commit direkt anhand seiner SHA-1-ID benennt, befinden Sie sich nicht in einem Zweig, sondern im Modus "Getrennter HEAD", der beim Auschecken eines früheren Zweigs auftritt verpflichten sich zu prüfen.
Danke, @mike! Dies ist die erste Antwort, die verdeutlicht, was passiert, wenn Sie ein früheres Commit auschecken. Als ich mir das Buch auf der Git-Website ansah, hatte ich den Eindruck, dass ein "losgelöster KOPF" ein pathologischer Zustand war, in den man nur geraten konnte, wenn man etwas Seltsames getan hatte. Das Auschecken eines früheren Commits ist jedoch keine seltsame Sache, und wenn Sie dies tun, ist HEAD nicht "die Spitze des aktuellen Zweigs". Es ist also das erste Mal, dass ich das Gefühl habe, tatsächlich zu verstehen.
Nat Kuhn
7
Ich denke, 'HEAD' ist das aktuelle Check-out-Commit. Mit anderen Worten, 'HEAD' zeigt auf das Commit, das gerade ausgecheckt ist.
Wenn Sie gerade geklont und nicht ausgecheckt haben, weiß ich nicht, worauf es hinweist, wahrscheinlich auf einen ungültigen Speicherort.
Ja, die spezielle Referenz HEADist das Commit, das Sie gerade ausgecheckt haben. Einzelheiten finden Sie im Handbuch (der entsprechende Absatz folgt unmittelbar auf Abb. 3.4).
Calrion
1
Wenn Sie ein Repository klonen, überprüft git standardmäßig den masterZweig - HEAD zeigt also auf master.
Sleske
1
@sleske Wenn Sie ein Repository ohne spezielle Optionen klonen, überprüft git den Remote-Kopf. es ist normalerweise master, aber es ist nicht immer. Sieheremote set-head
De Novo
Mein vorheriger Kommentar war korrekt, mit Ausnahme des Verweises auf remote set-head, der sich nur auf den lokalen Standardzweig auswirkt und den Standard auf dem Server nicht ändert.
De Novo
5
Der Kopf zeigt auf die Spitze des aktuell ausgecheckten Zweigs.
In Ihrem Repository befindet sich ein .git-Ordner. Öffnen Sie die Datei an diesem Speicherort: .git \ refs \ Heads. Der (sha-1-Hash-) Code in dieser Datei (in den meisten Fällen Master) ist das letzte Commit, dh das in der Ausgabe des Befehls angezeigte git log. Weitere Informationen zum Ordner .git: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html
Es ist ein weit verbreitetes Missverständnis, dass die Spitze des aktuellen Zweigs auf das letzte Commit verweist. Normalerweise stimmt das, aber es ist auch nicht ungewöhnlich git reset HEAD^, und dann wird das letzte Commit (der frühere Tipp) nicht mehr von der Spitze des Zweigs angezeigt.
LarsH
4
Eine gute Möglichkeit, den in den richtigen Antworten gemachten Punkt nach Hause zu fahren git reflog HEAD, besteht darin, zu rennen
. Sie erhalten eine Historie aller Orte, auf die HEAD hingewiesen hat.
Nachdem ich alle vorherigen Antworten gelesen hatte, wollte ich noch mehr Klarheit. Dieser Blog auf der offiziellen Git-Website http://git-scm.com/blog gab mir das, wonach ich suchte:
Der HEAD: Zeiger auf den letzten Commit-Snapshot, nächster Elternteil
Der HEAD in Git ist der Zeiger auf die aktuelle Verzweigungsreferenz, die wiederum ein Zeiger auf das letzte von Ihnen vorgenommene Commit oder das letzte Commit ist, das in Ihr Arbeitsverzeichnis ausgecheckt wurde. Das bedeutet auch, dass es das übergeordnete Element des nächsten Commits ist, das Sie ausführen. Es ist im Allgemeinen am einfachsten, sich das vorzustellen, da HEAD die Momentaufnahme Ihres letzten Commits ist.
Der HEAD: letzter Commit-Snapshot, der nächste Elternteil ist nicht korrekt. HEADist kein Commit; es zeigt auf eins.
Jub0bs
Keine Notwendigkeit für Sarkasmus; Obwohl das Zitat korrekt war, waren die großen, fett gedruckten Buchstaben vor Ihrer Bearbeitung eine Vereinfachung und etwas irreführend. Jetzt ist es besser.
Jub0bs
1
WENN Sie die nächste Zeile lesen: Der HEAD in Git ist der Zeiger auf die aktuelle Verzweigungsreferenz, die wiederum ein Zeiger auf das letzte von Ihnen vorgenommene Commit oder das letzte Commit ist, das in Ihr Arbeitsverzeichnis ausgecheckt wurde. - Bitte beachten Sie die Verwendung des Wortes "Zeiger" dort.
user3751385
Die Beschreibung "Last Commit Snapshot" vermittelt zwar ein konzeptionelles Gefühl dafür, wie HEAD normalerweise verwendet werden soll, ist jedoch nicht korrekt. Wenn ich ein Commit mache und dann zu einem anderen Zweig wechsle, zeigt HEAD nicht mehr auf den letzten Commit-Snapshot. Es zeigt auf den letzten Commit-Snapshot des Zweigs, zu dem ich gerade gewechselt habe. Wenn ich checkout HEAD^, zeigt HEAD jetzt nicht einmal auf den letzten Commit-Snapshot in einem Zweig.
LarsH
"Das übergeordnete Element Ihres nächsten Commits (wenn Sie jetzt ein Commit durchführen)" ist genauer, aber es gibt neben dem Commit noch viele andere Operationen in git, die von HEAD betroffen sind. Wirklich, am Ende ist HEAD HEAD, und seine Natur ist dadurch definiert, wie es wirkt sich auf Befehle wie commit, merge, rebase, log, etc. Aber konzeptionell vielleicht „(Zeiger auf) die aktuelle Position“ ist eine gute Zusammenfassung.
LarsH
3
Es scheint, dass dies HEADnur ein Tag für das letzte Commit ist, das Sie ausgecheckt haben.
Dies kann die Spitze eines bestimmten Zweigs sein (z. B. "Master") oder ein Zwischen-Commit eines Zweigs ("losgelöster Kopf").
Zusätzlich zu allen Definitionen fiel mir beim Festschreiben ein, dass GIT ein Festschreibungsobjekt im Repository erstellt. Commit-Objekte sollten ein übergeordnetes Element haben (oder mehrere übergeordnete Objekte, wenn es sich um ein Merge-Commit handelt). Woher kennt git das übergeordnete Element des aktuellen Commits? HEAD ist also ein Zeiger auf die (Referenz des) letzten Commits, der das übergeordnete Commit des aktuellen Commits wird.
Verweisen auf benannte Referenzen eines kürzlich eingereichten Zweigs. Sofern Sie nicht die Paketreferenz verwenden, werden die Köpfe normalerweise in $ GIT_DIR / refs / Heads / gespeichert.
KOPF
Der aktuelle Zweig oder Ihr Arbeitsbaum wird normalerweise aus dem Baum generiert, auf den HEAD zeigt. Der KOPF muss auf einen Kopf zeigen, es sei denn, Sie verwenden einen abgenommenen KOPF.
Nur-Link-Antworten werden bei Stackoverflow im Allgemeinen verpönt. Bitte geben Sie die relevanten Informationen in Ihrer Antwort an.
HaskellElephant
2
Das ist nicht ganz richtig. Was sich HEADbezieht, hängt davon ab, ob es sich um ein nacktes oder ein nicht nacktes Repo handelt. Im Kontext eines nicht nackten Repos bezieht es sich effektiv auf das aktuell ausgecheckte Commit, für das kein Zweig erforderlich ist (dh wenn es sich im getrennten HEADZustand befindet).
0
Ein Zweig ist eigentlich ein Zeiger, der eine Festschreibungs- ID wie 17a5 enthält .
HEAD ist ein Zeiger auf einen Zweig, an dem der Benutzer gerade arbeitet.
HEAD hat eine Referenzdatei, die folgendermaßen aussieht:
ref:
Sie können diese Dateien überprüfen, indem Sie auf .git/HEAD.git/refsdie Dateien in dem Repository zugreifen , in dem Sie arbeiten.
Gitdreht sich alles um Commits.
Und Headverweist auf das Commit, das Sie gerade ausgecheckt haben.
$ git cat-file -t HEAD
commit
Wenn Sie einen Zweig auschecken, zeigt der HEAD auf das letzte Commit für diesen Zweig. Der Inhalt von HEAD kann wie folgt überprüft werden (für Hauptzweig):
Als Konzept ist der Kopf die neueste Version in einer Branche. Wenn Sie mehr als einen Kopf pro benanntem Zweig haben, haben Sie ihn wahrscheinlich erstellt, wenn Sie lokale Commits ohne Zusammenführung ausführen und so einen unbenannten Zweig erstellen.
Um ein "sauberes" Repository zu haben, sollten Sie einen Kopf pro benanntem Zweig haben und immer zu einem benannten Zweig zusammengeführt werden, nachdem Sie lokal gearbeitet haben.
Antworten:
Sie können sich den HEAD als "aktuellen Zweig" vorstellen. Wenn Sie Zweige mit wechseln
git checkout
, ändert sich die HEAD-Revision so, dass sie auf die Spitze des neuen Zweigs zeigt.Sie können sehen, worauf HEAD zeigt, indem Sie Folgendes tun:
In meinem Fall lautet die Ausgabe:
HEAD kann auf eine bestimmte Revision verweisen, die keinem Zweigstellennamen zugeordnet ist. Diese Situation wird als losgelöster KOPF bezeichnet .
quelle
Um andere Leute zu zitieren :
Eine weitere gute Quelle, die schnell das Innenleben von Git (und damit ein besseres Verständnis von Köpfen / KOPF) abdeckt, finden Sie hier . Verweise (Ref. :) oder Köpfe oder Zweige können als Haftnotizen betrachtet werden, die auf Commits im Commit-Verlauf geklebt sind. Normalerweise zeigen sie auf die Spitze einer Reihe von Commits, aber sie können mit
git checkout
odergit reset
usw. verschoben werden .quelle
git checkout HEAD~2
), bei der es sich nicht um die Festschreibungs-ID eines bekannten Kopfes handelt. Eine ausführlichere Erklärung finden Sie im Artikel unter eagain.net/articles/git-for-computer-scientists .git revert
ist jedoch kein gutes Beispiel für das Verschieben eines Zweigs, um nicht an der Spitze zu sein, dagit revert
nur einige neue Commits erstellt werden und der aktuelle Zweig weiterhin an der (neuen) Spitze verbleibt.commit
s,reset
s usw. beeinflussen.Ich empfehle diese Definition von Github Entwickler Scott Chacon [ Video - Referenz ]:
Das ganze Video wird eine faire Einführung in das gesamte Git-System geben, daher empfehle ich Ihnen auch, alles anzuschauen, wenn Sie Zeit dazu haben.
quelle
HEAD ist nur ein spezieller Zeiger, der auf den lokalen Zweig verweist, in dem Sie sich gerade befinden.
Aus dem Pro Git- Buch, Kapitel 3.1 Git-Verzweigung - Verzweigungen auf den Punkt gebracht , im Abschnitt Erstellen einer neuen Verzweigung :
quelle
34ac2
im obigen Beispiel auschecken, zeigt HEAD jetzt auf dieses Commit und es wird als getrennter HEAD bezeichnet. In diesem Zustand können Sie auch Änderungen vornehmen, experimentieren und Änderungen festschreiben. Wenn Sie jedoch einen anderen Zweig auschecken, gehen alle Änderungen verloren, es sei denn, Sie erstellen einen neuen Zweig.git log
und bekam so etwas wiecommit ad0265... HEAD -> foo ...
das wäre die mittlerefoo
Zweig ist eine Referenz - ID zu begehenad0265
. Das Auschecken der Textreferenzfoo
ist kein losgelöster Kopf. Das Auschecken der Festschreibungs-IDad0265
würde zu einem abgetrennten Kopf führen. Vielleicht fehlt mir etwas Feines von dem, was Sie kommunizieren. Ich hoffe, diese Textwand hilft herauszufinden, wo ich verloren bin.Unter der Annahme, dass es sich nicht um einen Sonderfall handelt, der als "losgelöster KOPF" bezeichnet wird, bedeutet dies, wie im O'Reilly Git-Buch, 2. Ausgabe, S. 69, angegeben
HEAD
:damit
Beachten Sie, dass wir verwenden können
HEAD
, um auf das letzte Commit zu verweisen und esHEAD~
als Commit vor dem Tipp undHEAD~~
oderHEAD~2
als Commit noch früher usw. zu verwenden.quelle
Es gibt ein vielleicht subtiles, aber wichtiges Missverständnis in einer Reihe dieser Antworten. Ich dachte, ich würde meine Antwort hinzufügen, um es zu klären.
KOPF bist DU
HEAD
ist eine symbolische Referenz, die darauf verweist, wo immer Sie sich in Ihrem Commit-Verlauf befinden. Es folgt dir, wohin du auch gehst, was auch immer du tust, wie ein Schatten. Wenn Sie ein Commit machen,HEAD
wird sich bewegen. Wenn Sie etwas auschecken,HEAD
wird sich bewegen. Was auch immer Sie tun, wenn Sie in Ihrem Commit-Verlauf an einen neuen Ort gezogen sind,HEAD
ist mit Ihnen mitgezogen. Um ein häufiges Missverständnis anzusprechen: Sie können sich nicht davon lösenHEAD
. Das ist nicht das, was ein losgelöster HEAD-Zustand ist. Wenn Sie jemals denken: "Oh nein, ich bin in losgelöstem KOPF! Ich habe meinen KOPF verloren!" Denken Sie daran, es ist Ihr Kopf. KOPF bist du. Sie haben sich nicht vom KOPF gelöst, Sie und Ihr KOPF haben sich von etwas anderem gelöst.Woran kann HEAD anhängen?
HEAD
kann auf ein Commit verweisen, ja, aber normalerweise nicht. Lassen Sie mich das noch einmal sagen. VerweistHEAD
normalerweise nicht auf ein Commit. Es zeigt auf eine Zweigreferenz. Es ist an diesen Zweig angehängt , und wenn Sie bestimmte Dinge tun (z. B.commit
oderreset
), bewegt sich der angehängte Zweig mitHEAD
. Sie können sehen, worauf es zeigt, indem Sie unter die Haube schauen.Normalerweise bekommst du so etwas:
Manchmal bekommst du so etwas:
Das passiert, wenn
HEAD
direkt auf ein Commit verwiesen wird. Dies wird als losgelöster HEAD bezeichnet, daHEAD
er auf etwas anderes als eine Verzweigungsreferenz verweist. Wenn Sie in diesem Status ein Commit durchführenmaster
und nicht mehr an dieses gebunden sindHEAD
, wird es nicht mehr mit Ihnen mitgehen. Es spielt keine Rolle, wo sich dieses Commit befindet. Sie befinden sich möglicherweise im selben Commit wie Ihr Hauptzweig. Wenn SieHEAD
jedoch auf den Commit und nicht auf den Zweig verweisen, wird dieser getrennt und ein neuer Commit wird keiner Zweigreferenz zugeordnet.Sie können dies grafisch betrachten, wenn Sie die folgende Übung versuchen. Führen Sie dies in einem Git-Repository aus. Sie werden etwas anderes bekommen, aber die Schlüsselbits werden da sein. Wenn es Zeit ist, das Commit direkt auszuchecken, verwenden Sie einfach den abgekürzten Hash, den Sie von der ersten Ausgabe erhalten (hier ist er
a3c485d
).OK, hier gibt es einen kleinen Unterschied in der Ausgabe. Wenn Sie das Commit direkt (anstelle des Zweigs) auschecken, erhalten Sie ein Komma anstelle eines Pfeils. Was denkst du, sind wir in einem freistehenden HEAD-Zustand? HEAD bezieht sich immer noch auf eine bestimmte Revision, die einem Filialnamen zugeordnet ist. Wir sind immer noch in der Hauptniederlassung, nicht wahr?
Versuchen Sie jetzt:
Nee. Wir befinden uns im Status "freistehender KOPF".
Sie können die gleiche Darstellung von
(HEAD -> branch)
vs.(HEAD, branch)
mit sehengit log -1
.Abschließend
HEAD
bist du Es zeigt auf alles, was Sie ausgecheckt haben, wo immer Sie sind. In der Regel handelt es sich nicht um ein Commit, sondern um einen Zweig. WennHEAD
tut Punkt zu einem Commit (oder Tag), auch wenn es die gleichen commit (oder Tag) , dass ein Zweig auch Punkte, Sie (undHEAD
) haben aus diesem Zweig abgelöst worden. Da Ihnen kein Zweig zugeordnet ist, folgt der Zweig Ihnen nicht, wenn Sie neue Commits vornehmen.HEAD
wird jedoch.quelle
.git/HEAD
ist das, was die Software als HEAD betrachtet.HEAD
bezieht sich auf das aktuelle Commit, auf das Ihre Arbeitskopie verweist, dh auf das Commit, das Sie derzeit ausgecheckt haben. Aus der offiziellen Linux-Kernel-Dokumentation zum Spezifizieren von Git-Revisionen :Beachten Sie jedoch, dass in der kommenden Version 1.8.4 von Git
@
auch eine Abkürzung für verwendet werden kannHEAD
, wie Git-Mitarbeiter Junio C Hamano in seinem Git Blame-Blog feststellte :Der Stapelüberlaufbenutzer VonC fand in seiner Antwort auf eine andere Frage auch einige interessante Informationen darüber, warum
@
er als Abkürzung ausgewählt wurde .Interessant ist auch, dass in einigen Umgebungen keine Kapitalisierung erforderlich ist
HEAD
, insbesondere bei Betriebssystemen, bei denen Dateisysteme ohne Berücksichtigung der Groß- und Kleinschreibung verwendet werden, insbesondere Windows und OS X.quelle
Schauen Sie sich das Erstellen und Spielen mit Zweigen an
HEAD ist eigentlich eine Datei, deren Inhalt bestimmt, wo sich die HEAD-Variable bezieht:
In diesem Repository bezieht sich der Inhalt der HEAD-Datei auf eine zweite Datei mit dem Namen refs / Heads / Master . Die Datei refs / Heads / Master enthält den Hash des letzten Commits im Master-Zweig.
Das Ergebnis ist, dass HEAD-Punkte auf das Commit des Master-Zweigs aus der Datei .git / refs / Heads / Master verweisen.
quelle
Ich möchte nur ein paar Dinge in Greg Hewgils akzeptierter Antwort detailliert beschreiben. Laut Git Pocket Guide
Ast:
KOPF: Eine spezielle Art von Ref
Refs
Wie Greg erwähnte, kann sich HEAD in einem "getrennten Zustand" befinden. HEAD kann also entweder ein einfacher Ref (für einen abgetrennten HEAD) oder ein Symref sein.
quelle
Ich denke, 'HEAD' ist das aktuelle Check-out-Commit. Mit anderen Worten, 'HEAD' zeigt auf das Commit, das gerade ausgecheckt ist.
Wenn Sie gerade geklont und nicht ausgecheckt haben, weiß ich nicht, worauf es hinweist, wahrscheinlich auf einen ungültigen Speicherort.
quelle
HEAD
ist das Commit, das Sie gerade ausgecheckt haben. Einzelheiten finden Sie im Handbuch (der entsprechende Absatz folgt unmittelbar auf Abb. 3.4).master
Zweig - HEAD zeigt also auf master.master
, aber es ist nicht immer. Sieheremote set-head
remote set-head
, der sich nur auf den lokalen Standardzweig auswirkt und den Standard auf dem Server nicht ändert.Der Kopf zeigt auf die Spitze des aktuell ausgecheckten Zweigs.
In Ihrem Repository befindet sich ein .git-Ordner. Öffnen Sie die Datei an diesem Speicherort: .git \ refs \ Heads. Der (sha-1-Hash-) Code in dieser Datei (in den meisten Fällen Master) ist das letzte Commit, dh das in der Ausgabe des Befehls angezeigte
git log
. Weitere Informationen zum Ordner .git: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.htmlquelle
git reset HEAD^
, und dann wird das letzte Commit (der frühere Tipp) nicht mehr von der Spitze des Zweigs angezeigt.Eine gute Möglichkeit, den in den richtigen Antworten gemachten Punkt nach Hause zu fahren
git reflog HEAD
, besteht darin, zu rennen . Sie erhalten eine Historie aller Orte, auf die HEAD hingewiesen hat.quelle
Nachdem ich alle vorherigen Antworten gelesen hatte, wollte ich noch mehr Klarheit. Dieser Blog auf der offiziellen Git-Website http://git-scm.com/blog gab mir das, wonach ich suchte:
Der HEAD: Zeiger auf den letzten Commit-Snapshot, nächster Elternteil
quelle
HEAD
ist kein Commit; es zeigt auf eins.checkout HEAD^
, zeigt HEAD jetzt nicht einmal auf den letzten Commit-Snapshot in einem Zweig.commit
,merge
,rebase
,log
, etc. Aber konzeptionell vielleicht „(Zeiger auf) die aktuelle Position“ ist eine gute Zusammenfassung.Es scheint, dass dies
HEAD
nur ein Tag für das letzte Commit ist, das Sie ausgecheckt haben.Dies kann die Spitze eines bestimmten Zweigs sein (z. B. "Master") oder ein Zwischen-Commit eines Zweigs ("losgelöster Kopf").
quelle
Zusätzlich zu allen Definitionen fiel mir beim Festschreiben ein, dass GIT ein Festschreibungsobjekt im Repository erstellt. Commit-Objekte sollten ein übergeordnetes Element haben (oder mehrere übergeordnete Objekte, wenn es sich um ein Merge-Commit handelt). Woher kennt git das übergeordnete Element des aktuellen Commits? HEAD ist also ein Zeiger auf die (Referenz des) letzten Commits, der das übergeordnete Commit des aktuellen Commits wird.
quelle
Diese beiden können Sie verwirren:
Kopf
Verweisen auf benannte Referenzen eines kürzlich eingereichten Zweigs. Sofern Sie nicht die Paketreferenz verwenden, werden die Köpfe normalerweise in $ GIT_DIR / refs / Heads / gespeichert.
KOPF
Der aktuelle Zweig oder Ihr Arbeitsbaum wird normalerweise aus dem Baum generiert, auf den HEAD zeigt. Der KOPF muss auf einen Kopf zeigen, es sei denn, Sie verwenden einen abgenommenen KOPF.
quelle
Schauen Sie sich http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is an
quelle
HEAD
bezieht, hängt davon ab, ob es sich um ein nacktes oder ein nicht nacktes Repo handelt. Im Kontext eines nicht nackten Repos bezieht es sich effektiv auf das aktuell ausgecheckte Commit, für das kein Zweig erforderlich ist (dh wenn es sich im getrenntenHEAD
Zustand befindet).Ein Zweig ist eigentlich ein Zeiger, der eine Festschreibungs- ID wie 17a5 enthält . HEAD ist ein Zeiger auf einen Zweig, an dem der Benutzer gerade arbeitet.
HEAD hat eine Referenzdatei, die folgendermaßen aussieht:
ref:
Sie können diese Dateien überprüfen, indem Sie auf
.git/HEAD
.git/refs
die Dateien in dem Repository zugreifen , in dem Sie arbeiten.quelle
Git
dreht sich alles um Commits.Und
Head
verweist auf das Commit, das Sie gerade ausgecheckt haben.Wenn Sie einen Zweig auschecken, zeigt der HEAD auf das letzte Commit für diesen Zweig. Der Inhalt von HEAD kann wie folgt überprüft werden (für Hauptzweig):
quelle
Als Konzept ist der Kopf die neueste Version in einer Branche. Wenn Sie mehr als einen Kopf pro benanntem Zweig haben, haben Sie ihn wahrscheinlich erstellt, wenn Sie lokale Commits ohne Zusammenführung ausführen und so einen unbenannten Zweig erstellen.
Um ein "sauberes" Repository zu haben, sollten Sie einen Kopf pro benanntem Zweig haben und immer zu einem benannten Zweig zusammengeführt werden, nachdem Sie lokal gearbeitet haben.
Dies gilt auch für Mercurial .
quelle