Wat is HEAD in Git?

Je ziet de Git-documentatie dingen zeggen als

De vertakking moet volledig worden samengevoegd in HEAD.

Maar wat is Git Headprecies?


Antwoord 1, autoriteit 100%

Je kunt de HEAD zien als de “huidige tak”. Wanneer je van branch wisselt met git checkout, verandert de HEAD-revisie om naar de punt van de nieuwe branch te wijzen.

Je kunt zien waar HEAD naar verwijst door het volgende te doen:

cat .git/HEAD

In mijn geval is de uitvoer:

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

Het is mogelijk dat HEAD verwijst naar een specifieke revisie die niet is gekoppeld aan een filiaalnaam. Deze situatie wordt een vrijstaande HEADgenoemd.


Antwoord 2, autoriteit 24%

Om andere mensente citeren:

Een kop is gewoon een verwijzing naar een
voorwerp begaan. Elk hoofd heeft een naam
(taknaam of tagnaam, enz.). Door
standaard is er een hoofd in elke
opslagplaats genaamd master. een opslagplaats
kan een willekeurig aantal koppen bevatten. Bij
op elk willekeurig moment wordt één kop geselecteerd
als het ‘huidige hoofd’. Dit hoofd is
alias naar HEAD, altijd in hoofdletters”.

Let op dit verschil: een “hoofd”
(kleine letters) verwijst naar een van de
benoemde hoofden in de repository; “HOOFD”
(hoofdletters) verwijst uitsluitend naar de
momenteel actief hoofd. Dit
onderscheid wordt vaak gebruikt in Git
documentatie.

Een andere goede bron die snel de innerlijke werking van git behandelt (en daardoor een beter begrip van heads/HEAD) is te vinden hier. Referenties (ref:) of heads of branches kunnen worden beschouwd als post-it-notities die op commits in de commit-geschiedenis worden geplakt. Meestal wijzen ze naar de tip van reeksen commits, maar ze kunnen worden verplaatst met git checkoutof git resetenz.


Antwoord 3, autoriteit 8%

HEAD is slechts een speciale aanwijzer die verwijst naar de lokale vestiging waar u zich momenteel bevindt.

Uit het Pro Gitboek, hoofdstuk 3.1 Git Branching – Branches in een notendop, in de sectie Creëren een nieuwe vestiging:

Wat gebeurt er als je een nieuwe branch aanmaakt? Welnu, als u dit doet, ontstaat er een nieuwe
aanwijzer voor u om te bewegen. Laten we zeggen dat u een nieuw filiaal maakt
testen genoemd. Dit doe je met het git branch commando:

$ git branch testing 

Dit creëert een nieuwe pointer op dezelfde commit waar je momenteel op zit

Hoe weet Git in welke branch je momenteel zit? Het houdt een speciale aanwijzer genaamd HEAD. Merk op dat dit heel wat anders is dan
het concept van HEAD in andere VCS’s waaraan u misschien gewend bent, zoals:
Subversie of CVS. In Git is dit een verwijzing naar de lokale branch
je bent momenteel aan. In dit geval ben je nog steeds op master. de git
branch-opdracht heeft alleen een nieuwe branch gemaakt – het is daar niet naar overgeschakeld
filiaal.


Antwoord 4, autoriteit 8%

Ik raad deze definitie aan van github-ontwikkelaar Scott Chacon [videoreferentie ]:

Head is je huidige branch. Het is een symbolische verwijzing. Het is een verwijzing naar een filiaal. Je hebt altijd HEAD, maar HEAD wijst naar een van deze andere wijzers, naar een van de branches waar je op zit. Het is de ouder van je volgende commit. Het is wat zou moeten zijn wat het laatst is uitgecheckt in uw werkdirectory… Dit is de laatst bekende staat van wat uw werkdirectory was.

De hele video geeft een goede introductie tot het hele git-systeem, dus ik raad je ook aan om het allemaal te bekijken als je daar tijd voor hebt.


Antwoord 5, autoriteit 5%

Ervan uitgaande dat het geen speciaal geval is genaamd “detached HEAD”, dan, zoals vermeld in het O’Reilly Git boek, 2e editie, p.69, betekent Head:

Headverwijst altijd naar de meest recente commit op de huidige
tak. Wanneer je van branch verandert, wordt Headbijgewerkt om te verwijzen naar de nieuwe
de laatste commit van de branch.

dus

Headis de “tip” van de huidige tak.

Merk op dat we Headkunnen gebruiken om te verwijzen naar de meest recente commit, en HEAD~te gebruiken als de commit voor de tip, en HEAD~~of HEAD~2als de commit nog eerder, enzovoort.


Antwoord 6, autoriteit 3%

Headverwijst naar de huidige commit waar je werkkopie naar verwijst, d.w.z. de commit die je momenteel hebt uitgecheckt. Uit de officiële Linux Kernel-documentatie over het specificeren van Git-revisies:

Headbenoemt de commit waarop je de wijzigingen in de werkboom hebt gebaseerd.

Houd er echter rekening mee dat in de komende versie 1.8.4 van Git, @ook kan worden gebruikt als een afkorting voor Head, als opgemerkt door Git-bijdrager Junio C Hamano in zijn Git Blame-blog:

In plaats van ‘HEAD’ te typen, kun je ook ‘@’ zeggen, bijv. “git log @”.

Stack Overflow-gebruiker VonCvond ook enkele interessante informatie over waarom @werd gekozen als afkorting in zijn antwoord op een andere vraag.

Ook interessant, in sommige omgevingen is het niet nodig om Headmet een hoofdletter te schrijven, met name in besturingssystemen die hoofdletterongevoelige bestandssystemen gebruiken, met name Windows en OS X.


Antwoord 7, autoriteit 2%

Bekijk Creëren en spelen met branches

HEAD is eigenlijk een bestand waarvan de inhoud bepaalt waar de HEAD-variabele naar verwijst:

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

In deze repository verwijst de inhoud van het HEAD-bestand naar een tweede bestand met de naam refs/heads/master. Het bestand refs/heads/masterbevat de hash van de meest recente commit op de master branch.

Het resultaat is dat HEAD punten naar de master branch commit uit het .git/refs/heads/masterbestand.


Antwoord 8, autoriteit 2%

Na het lezen van alle voorgaande antwoorden, wilde ik toch meer duidelijkheid. Deze blog op de officiële git-website http://git-scm.com/bloggaf me wat ik was op zoek naar:

The HEAD: Pointer naar laatste commit snapshot, volgende ouder

De HEAD in Git is de pointernaar de huidige branchreferentie, die op zijn beurt een pointeris naar de laatste commit die je hebt gemaakt of de laatste commit die is uitgecheckt in uw werkmap. Dat betekent ook dat het de ouder zal zijn van de volgende commit die je doet. Het is over het algemeen het eenvoudigst om eraan te denken, aangezien HEAD de momentopname is van je laatste commit.


Antwoord 9, autoriteit 2%

Ik zou graag een paar dingen in het geaccepteerde antwoord van Greg Hewgil willen uitleggen.
Volgens de Git Pocket Guide

Branche:

de branch zelf wordt gedefinieerd als alle punten die in de commit bereikbaar zijn
grafiek van de genoemde commit (de “tip” van de branch).

HEAD:Een speciaal type Ref

De speciale ref HEAD bepaalt in welke branche je zit…

Referenties

Git definieert twee soorten referenties, of benoemde pointers, die het aanroept
“referen”:

  • Een eenvoudige ref, die rechtstreeks naar een object-ID verwijst (meestal een vastlegging of tag)
  • Een symbolische ref (of symref), die verwijst naar een andere ref (eenvoudig of symbolisch)

Zoals Greg al zei, kan HEAD zich in een “losstaande staat” bevinden. HEAD kan dus een eenvoudige ref zijn (voor een vrijstaande HEAD) of een symref.

Als HEAD een symbolische ref is voor een bestaande branch, dan ben je “aan”
die tak. Als, aan de andere kant, hoofd is direct een eenvoudige ref
Een commit namen door zijn SHA-1 ID, dan ben je niet “op” elke tak, maar
in plaats in “vrijstaande hoofd” -modus, wat gebeurt er wanneer u wat uitcheckt
eerder commit om te onderzoeken.


10

Ik denk dat ‘hoofd’ huidige uitcheckplicht is. Met andere woorden ‘Head’ wijst op de commit die momenteel wordt uitgecheckt.

Als u zojuist hebt gekloneerd en niet uitgecheckt, weet ik niet wat het wijst, waarschijnlijk een ongeldige locatie.


11

Een geweldige manier om naar huis te rijden, is het punt gemaakt in de juiste antwoorden is om te rennen
git reflog HEAD, je krijgt een geschiedenis van alle Places Head heeft gewezen.


12

Hoofd wijst naar de punt van de momenteel ingecheckte tak.

In uw repository is er een map .git. Open het bestand in deze locatie: .git \ Refs \ Heads. De (SHA-1 HASH) -code in dat bestand (Master in de meeste gevallen) is de meest recente commit, d.w.z.nl gezien in de uitvoer van de opdracht git log. Meer info over de map .git: http: / /gitready.com/advanced/ 2009/03/23/whats-inside-your-git-directory.html


13

Het voelt als dat Headis slechts een tag voor de laatste commit die u hebt uitgecheckt.

Dit kan de punt van een specifieke tak zijn (zoals “Master”) of wat in-tussen commit van een filiaal (“vrijstaand hoofd”)


14

Naast alle definities, was het ding dat in mijn hoofd bleef hangen, wanneer je een commit maakt, GIT een commit-object maakt in de repository. Commit-objecten moeten een ouder hebben (of meerdere ouders als het een merge-commit is). Hoe weet git nu de ouder van de huidige commit? HEAD is dus een verwijzing naar de (referentie van de) laatste commit die de ouder wordt van de huidige commit.


Antwoord 15

Gitdraait helemaal om commits.
En Headwijst naar de commit die je momenteel hebt uitgecheckt.

$ git cat-file -t HEAD
commit

Telkens wanneer je een branch uitcheckt, wijst de HEAD naar de laatste commit op die branch. De inhoud van HEAD kan als volgt worden gecontroleerd (voor master branch):

$ cat .git/refs/heads/master
  b089141cc8a7d89d606b2f7c15bfdc48640a8e25

Antwoord 16

Ik ben ook nog steeds bezig met het uitzoeken van de binnenkant van git, en heb dit tot nu toe ontdekt:

Laten we zeggen dat de huidige branch masteris.

  1. HEADis een bestand in je .git/-directory dat er normaal gesproken ongeveer zo uitziet:
% cat .git/HEAD
ref: refs/heads/master
  1. refs/heads/masteris zelf een bestand dat normaal gesproken de hash-waarde heeft van de laatste commit van master:
% cat .git/refs/heads/master 
f342e66eb1158247a98d74152a1b91543ece31b4
  1. Als je een git logdoet, zul je zien dat dit de laatste commit is voor master:
% git log --oneline 
f342e66 (HEAD -> master,...) latest commit
fa99692 parent of latest commit

Dus ik denk dat het HEAD-bestand een handige manier is om de laatste commit bij te houden, in plaats van lange hash-waarden te onthouden.


Antwoord 17

Deze twee kunnen je verwarren:

hoofd

Verwijzend naar benoemde referenties die een branch onlangs heeft ingediend. Tenzij u de pakketreferentie gebruikt, worden heads doorgaans opgeslagen in $ GIT_DIR/refs/heads/.

HOOFD

Huidige tak, of je werkboom, wordt meestal gegenereerd vanuit de boom waarnaar HEAD verwijst. HEAD moet naar een hoofd wijzen, behalve dat je een vrijstaande HEAD gebruikt.


Antwoord 18

Bekijk http://git- scm.com/book/en/Git-Branching-What-a-Branch-Is

Figuur 3-5. HEAD-bestand dat verwijst naar de branch waar u zich bevindt.


Antwoord 19

Een branchis eigenlijk een pointer met een commit ID zoals 17a5.
HEADis een verwijzing naar een branch waar de gebruiker momenteel aan werkt.

HEADheeft een referentiebestand dat er als volgt uitziet:

ref:

Je kunt deze bestanden controleren door .git/HEAD.git/refste openen in de repository waarin je werkt.


Antwoord 20

HEAD is eigenlijk gewoon een bestand voor het opslaan van huidige filiaalinfo

en als je HEAD gebruikt in je git-commando’s, dan verwijs je naar je huidige branch

u kunt de gegevens van dit bestand zien door
cat .git/HEAD


Antwoord 21

Illustratie die laat zien wat HEAD is, inclusief een zij aan zij vergelijking van hoe HEAD wordt gemanipuleerd in aangeslotenof losstaandstaat verschilt.

Een veel voorkomende misvatting is dat het bericht U bevindt zich in de status ‘losstaande HEAD’een verkeerde toon heeft, terwijl het in feite alleen beschrijft hoe HEAD verwijst naar de huidige momentopname .

Om van de losgekoppelde naar de gekoppelde status te gaan, kun je ofwel een nieuwe vertakking maken van waar je bent, of overschakelen naar een bestaande vertakking. Merk op dat alle commits die in ontkoppelde staat zijn gemaakt uiteindelijk zullen worden weggegooid als je naar een andere bestaande branch overschakelt.


Antwoord 22

Als concept is de kop de laatste revisie in een branche. Als je meer dan één head per benoemde branch hebt, heb je deze waarschijnlijk gemaakt toen je lokale commits deed zonder samen te voegen, waardoor je effectief een naamloze branch aanmaakte.

Om een “schone” repository te hebben, moet je één head per benoemde branch hebben en altijd mergen naar een benoemde branch nadat je lokaal hebt gewerkt.

Dit geldt ook voor Mercurial.

Other episodes