Was ist der KOPF in Git?

232

Es scheint einen Unterschied zwischen dem letzten Commit, dem HEAD und dem Status der Datei zu geben, die ich in meinem Verzeichnis sehen kann.

Was ist HEAD, was kann ich damit machen und welchen Fehler sollte ich vermeiden?

e-satis
quelle
1
Ab Git v1.8.4 werden alle Antworten unten verwendet HEADoder headkönnen jetzt @anstelle von HEADstattdessen verwendet werden. In dieser Antwort (letzter Abschnitt) erfahren Sie, warum Sie das tun können.
3
Von git-scm : 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.
Quazi Irfan
3
Mögliches Duplikat von Was ist HEAD in Git?
Buts

Antworten:

185

HEAD ist ein Verweis auf das letzte Commit in der aktuell ausgecheckten Verzweigung.


Es gibt eine kleine Ausnahme, nämlich den abgetrennten KOPF. Ein losgelöster HEAD ist die Situation, in der Sie sich befinden, wenn Sie ein Commit (oder Tag) anstelle eines Zweigs auschecken. In diesem Fall müssen Sie sich dies als temporären Zweig ohne Namen vorstellen . Anstatt eine benannte Zweigreferenz zu haben, haben wir nur HEAD. Sie können weiterhin Commits vornehmen (wodurch HEAD aktualisiert wird). Die obige Kurzdefinition gilt also weiterhin, wenn Sie sich einen getrennten HEAD als temporären Zweig ohne Namen vorstellen.

Sack
quelle
1
Warum kannst du zwei Köpfe haben?
E-Satis
1
@ e-satis: Manchmal sehen Sie Zweige, die als Köpfe bezeichnet werden - sie werden in gespeichert refs/heads. Kleinbuchstaben unterscheiden sich jedoch von HEAD. Meine Antwort verdeutlicht dies ein wenig.
Cascabel
7
@ e-satis: Das ist kein Regex. Das ^ist nur die Notation von git für "das Festschreiben vor" - das ist das Festschreiben vor dem aktuellen. (Wenn der Strom eine Zusammenführung ist, verwendet er das erste übergeordnete
Cascabel
1
@ e-satis: Weitere Informationen zu allen Möglichkeiten zum Festlegen von Commits finden Sie im Abschnitt zum Angeben von Revisionen auf der Manpage für die Git-Rev-Liste. Dies ist nur ein winziger Teil. kernel.org/pub/software/scm/git/docs/…
Cascabel
1
Nein, wenn rev und HEAD auf dasselbe Commit zeigen, gibt es keinen Unterschied. Sie können sogar die Commit-ID (den SHA-1-Wert) anstelle von rev oder HEAD schreiben. Und mach dir keine Sorgen, du belästigst uns nicht mit den Fragen :) (ich zumindest: P)
stupse
87

HEAD ist ein Verweis (Verweis) auf das aktuell ausgecheckte Commit.

Im Normalzustand handelt es sich tatsächlich um einen symbolischen Verweis auf den Zweig, den Sie ausgecheckt haben. Wenn Sie sich den Inhalt von .git / HEAD ansehen, sehen Sie so etwas wie "ref: refs / Heads / Master". Der Zweig selbst ist ein Verweis auf das Commit an der Spitze des Zweigs. HEADBezieht sich daher im Normalzustand effektiv auf das Festschreiben an der Spitze des aktuellen Zweigs.

Es ist auch möglich, einen "abgetrennten KOPF" zu haben. Dies geschieht, wenn Sie etwas anderes als einen (lokalen) Zweig auschecken, z. B. einen Remote-Zweig, ein bestimmtes Commit oder ein Tag. Dies wird am häufigsten während einer interaktiven Rebase angezeigt, wenn Sie ein Commit bearbeiten. Im getrennten HEAD-Status ist Ihr HEAD ein direkter Verweis auf ein Commit - der Inhalt von .git / HEAD ist ein SHA1-Hash.

Im Allgemeinen ist HEAD nur ein bequemer Name für "was Sie ausgecheckt haben" und Sie müssen sich nicht wirklich darum kümmern. Seien Sie sich nur bewusst, was Sie ausgecheckt haben, und denken Sie daran, dass Sie wahrscheinlich keine Festschreibung vornehmen möchten, wenn Sie sich nicht in einem Zweig befinden (getrennter HEAD-Status), es sei denn, Sie wissen, was Sie tun (z. B. in einer interaktiven Rebase). .

Cascabel
quelle
6
Das verstehe ich nicht. Wenn Sie einen Remote-Zweig auschecken, warum erhalten Sie dann einen "abgetrennten HEAD"? Warum springen Sie nicht automatisch in den Zweig Ihres lokalen Repos, der Ihrer Fernbedienung entspricht?
E-Satis
3
@ e-satis: Wenn Sie den lokalen Zweig möchten, überprüfen Sie den lokalen Zweig. Denken Sie daran, dass die beiden nicht unbedingt gleich sind - Sie müssen den lokalen Benutzer anweisen, den entfernten zusammenzuführen (oder zu ziehen). Das Tracking ist nur so, dass es weiß, welches automatisch gezogen werden soll, wenn Sie fragen. Der Grund für die Trennung ist, dass der Remote-Zweig ein Zeiger auf die zuletzt gesehene Position des Zweigs im Remote-Repo sein soll. Wenn Sie versuchen, sich darauf festzulegen, ändert sich das Remote-Repo nicht, sodass der Remote-Zweig dies auch nicht tun sollte.
Cascabel
1
OK, das habe ich nicht verstanden: Wenn ein lokaler Zweig so benannt ist, bedeutet dies nicht, dass er mit dem entfernten Zweig identisch ist. Am Anfang sehr schwer zu bekommen, da ich einen SVN-Hintergrund habe :-) Danke Mann. Übrigens, wie kann man einen kopflosen KOPF in eine lokale Niederlassung verlegen, um ihn hier festzulegen?
E-Satis
3
@ e-satis: Die allgemeine Antwort lautet git rebase <branch> HEAD. Dies wird den letzten gemeinsamen Vorfahren von <branch>und HEADfinden und dann alle Commits von dort übernehmen HEADund auf sie anwenden (sie neu gründen) <branch>. Dies geschieht im Wesentlichen, indem sie als Patches angewendet werden. Wenn sich die beiden Zweige also wirklich unterscheiden, kann es zu Konflikten kommen. Aber wenn <branch>es sich um einen Vorfahren von handelt HEAD(dh Sie waren am richtigen Ort, haben nur vergessen, dass Sie sich gelöst haben HEAD), ist die Rebase nur eine schnelle Zusammenführung.
Cascabel
3
Dies ist eine der klarsten und genauesten Beschreibungen von Git HEAD, die ich nach einer Weile der Suche gesehen habe.
LarsH
21

Ich dachte immer, dass ich HEAD~5vorher zu 5 Commits gehen soll. Der GO-Teil des Befehls ist jedoch nicht enthalten. Es enthält nur die Referenz / 'wohin' Teil des Befehls.

In Laienbegriffen wird es verwendet, um die Frage zu beantworten: Wohin soll ich gehen? Zu welchem ​​Commit?

  • HEAD bedeutet (den Verweis auf das) aktuelle Commit
  • HEAD~1 bedeutet (der Verweis auf) 1 Commit vor
  • HEAD~ AUCH bedeutet (der Verweis auf) 1 Commit vor
  • HEAD~87 bedeutet (der Verweis auf) 87 Commits vor

Verwendung:

  • git checkout HEAD~1 wird tatsächlich GO / Checkout zu 1 Commit / Referenz vor
  • git reset HEAD~3 Aufheben der Festschreibung Ihrer letzten 3 Commits - ohne die Änderungen zu entfernen, dh Sie können alle Änderungen, die in den letzten 3 Commits vorgenommen wurden, zusammen anzeigen, alles entfernen, was Ihnen nicht gefällt, oder hinzufügen und dann alle erneut festschreiben.
  • git diff HEAD~3 zum Überprüfen von Änderungen in den letzten 3 Commits
Honig
quelle
3
Ich komme auf meine eigene Antwort zurück :)
Honey
15

HEAD Zeiger in Git

Git verwaltet eine Referenzvariable namens HEAD. Und wir nennen diese Variable einen Zeiger, weil ihr Zweck darin besteht, auf ein bestimmtes Commit im Repository zu verweisen oder darauf zu verweisen. Wenn wir neue Commits durchführen, wird sich der Zeiger ändern oder auf ein neues Commit zeigen. HEAD zeigt immer auf die Spitze des aktuellen Zweigs in unserem Repository. Dies hat nun mit unserem Repository zu tun, nicht mit unserem Staging-Index oder unserem Arbeitsverzeichnis.

Eine andere Möglichkeit, sich das vorzustellen, ist der letzte Status unseres Repositorys oder der zuletzt ausgecheckte Status. Da das Repository dort aufgehört hat oder der letzte Status, können Sie auch sagen, dass der HEAD auf das übergeordnete Element des nächsten Commits verweist oder auf dieses wo Commit-Schreiben stattfinden wird.

Ich denke, eine gute Metapher, um darüber nachzudenken, ist die Wiedergabe und der Aufnahmekopf auf einem Kassettenrekorder. Wenn wir mit der Audioaufnahme beginnen, bewegt sich das Band am Kopf vorbei und nimmt es auf. Wenn wir Stopp drücken, ist die Stelle, an der der Aufzeichnungskopf gestoppt ist, die Stelle, an der die Aufnahme erneut gestartet wird, wenn wir ein zweites Mal auf Aufnahme drücken. Jetzt können wir uns bewegen, wir können den Kopf an verschiedene Stellen bewegen, aber überall dort, wo der Kopf positioniert ist Wenn wir erneut auf Aufnahme klicken, wird dort mit der Aufnahme begonnen.

Der HEAD-Zeiger in Git ist sehr ähnlich und zeigt auf die Stelle, an der wir als nächstes mit der Aufnahme beginnen werden. Es ist der Ort, an dem wir in unserem Repository für die Dinge aufgehört haben, die wir begangen haben.

Suhail Gupta
quelle
0

In einfachen Worten ist HEAD ein Verweis auf das letzte Commit in der aktuellen Check-out-Filiale.

Stellen Sie sich den KOPF als "aktuellen Zweig" vor. Wenn Sie Zweige mit Git Checkout wechseln, ä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

HEAD kann auf eine bestimmte Revision verweisen, die keinem Zweigstellennamen zugeordnet ist. Diese Situation wird als losgelöster KOPF bezeichnet.

Testilla
quelle