Was ist HEAD in Git?

Antworten:

775

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 .

Greg Hewgill
quelle
53
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.
Greg Hewgill
16
@Meng Dieser hat mir geholfen, hoffe es hilft: marklodato.github.com/visual-git-guide/index-en.html
Raphael
54
@ 動靜 能量: 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.
Ben Collins
184

Um andere Leute zu zitieren :

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 .

Silfheed
quelle
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.

Jasoares
quelle
34
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.

Aus dem Pro Git- Buch, Kapitel 3.1 Git-Verzweigung - Verzweigungen auf den Punkt gebracht , im Abschnitt Erstellen einer neuen Verzweigung :

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

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein

Alexandr
quelle
4
Schön, könnte ein Bild verwenden, das den abgetrennten HEAD-Fall zeigt
Don Hatch
@ DonHatch, gute Erklärung des abgetrennten HEAD stackoverflow.com/a/35301963/1074179
Alexandr
3
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.

Unpolarität
quelle
27

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).

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 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 HEAD tut 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.

De Novo
quelle
1
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.
ata
22

HEADbezieht 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 :

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

Beachten Sie jedoch, dass in der kommenden Version 1.8.4 von Git @auch eine Abkürzung für verwendet werden kann HEAD, wie Git-Mitarbeiter Junio ​​C Hamano in seinem Git Blame-Blog feststellte :

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

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.

Gemeinschaft
quelle
17

Schauen Sie sich das Erstellen und Spielen mit Zweigen an

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 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.

Geben Sie hier die Bildbeschreibung ein

onmyway133
quelle
1
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.

Mike
quelle
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.

Nataraj
quelle
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.

Geben Sie hier die Bildbeschreibung ein

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

stack1
quelle
1
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.

tjb
quelle
4

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.

user3751385
quelle
1
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").

Vertexwahn
quelle
1

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.

Anwar Husain
quelle
0

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.

Marcus Thornton
quelle
0

Schauen Sie sich http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is an

Abbildung 3-5. HEAD-Datei, die auf den Zweig zeigt, in dem Sie sich befinden.

Ting Wang
quelle
4
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.

Okd
quelle
0

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):

$ cat .git/refs/heads/master
  b089141cc8a7d89d606b2f7c15bfdc48640a8e25
SR Chaitanya
quelle
-5

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 .

dukeofgaming
quelle
4
Dies gilt für Mercurial, nicht jedoch für Git.
Stellen Sie Monica wieder her - notmaynard