Refs en symrefs
Op deze pagina:
Een ref is een hash ID die verwijst naar een object in de Git object store. Een ref mag verwijzen naar elk Git object, maar verwijst meestal naar een commit object. Een symbolische referentie, of symref, is een naam die indirect wijst naar een Git object, maar is nog steeds een ref. Lokale topic branch namen, remote tracking branch namen en tag namen zijn allemaal refs.
Iedere symbolische ref heeft een uitdrukkelijke volledige naam die begint met refs/ en elk wordt hierarchisch opgeslagen in de repository in de .git/refs/ directory.
Er zijn drie verschillende naamgebieden vertegenwoordigd in refs/:
refs/heads/ref voor je lokale braches;
refs/remotes/ref voor je remote tracking branches;
refs/tags/ref voor je tags.
Een lokale topic branch genaamd dev is bijvoorbeeld een korte vorm van refs/heads/dev.
Remote tracking branches zijn in het refs/remotes/ naamgebied, dus origin/master heet daadwerkelijk refs/remotes/origin/master.
Een tag zoals v2.5.27 is bijvoorbeeld kort voor refs/tags/v2.5.27.
Je kunt de volledige ref naam of de afkorting gebruiken, als je een branch hebt en een tag met dezelfde naam, dan gebruikt git de eerste match in deze volgorde:
- .git/ref
- .git/refs/ref
- .git/refs/tags/ref
- .git/refs/heads/ref
- .git/refs/remotes/ref
- .git/refs/remotes/ref/HEAD
De eerste regel is meestal alleen voor HEAD, ORIG_HEAD, FETCH_HEAD, MERGE_HEAD en CHERRY_PICK_HEAD.
Technisch gezien kan ook de naam van de git directory .git aangepast worden, daarom wordt de variabele $GIT_DIR gebruikt in plaats van het letterlijke .git.
Git onderhoudt een aantal speciale symrefs automatisch voor bepaalde doelen. Ze kunnen overal gebruikt worden waar een commit gebruikt wordt. Al deze symbolisch referenties worden gemanaged door de opdracht git symbolic-ref.
Als je de opdracht git symbolic-ref ingeeft zonder opties/parameters, dan krijg je dit overzicht:
HEAD
HEAD verwijst altijd naar de meest recente commit op de huidige branch. Als je van branch wisselt, dan wordt HEAD geupdate om te verwijzen naar de meest recente commit van de nieuwe branch.
ORIG_HEAD
Bepaalde operaties, zoals merge en reset, slaan de vorige versie van HEAD op in ORIG_HEAD voordat ze deze aanpassen naar een nieuwe waarde. ORIG_HEAD kan je dan gebruiken om terug te gaan naar de vorige staat of om een vergelijking te maken.
FETCH_HEAD
Bij het gebruik van remote repositories slaat git fetch de heads van alle branches die gefetched worden op in het bestand .git/FETCH_HEAD.
FETCH_HEAD is kort voor de head van de laatste branch die gefetched is en is alleen geldig onmiddelijk na een fetch operatie.
Door deze symref te gebruiken kan je de HEAD vinden van commits van git fetch zelfs als een anonieme fetch die geen naam geeft aan een branch gebruikt wordt.
MERGE_HEAD
Wanneer een merge bezig is, dan wordt de tip van de andere branch tijdelijk opgeslagen in de symref MERGE_HEAD. Met andere woorden, MERGE_HEAD is de commit die wordt gemerged naar HEAD.
CHERRY_PICK_HEAD
Wanneer het niet duidelijk is hoe een verandering toegepast moet worden, blijven de current branch en de HEAD bij de laatste succesvolle commit. De CHERRY_PICK_HEAD ref wordt ingesteld op het punt in de commit van de verandering die moeilijk is toe te passen.