Git basis begrippen
Op deze pagina:
Enige kennis van deze basisbegrippen is handig als je met Git werkt zodat je beter begrijpt wat je aan het doen bent.
Repositories
Een git repository is een database die alle informatie bevat die nodig is om de veranderingen en geschiedenis van een project te volgen en te bewaren. Git bewaart een complete kopie van het gehele project gedurende de loopduur van het project alsmede een kopie van het project waarmee gewerkt wordt.
Git onderhoudt een set met configuratie waarden binnen elke repository. Deze configuratie waarden zijn specifiek voor de repository en gaan niet mee met het klonen van een repository, in tegenstelling tot bestandsgegevens en andere metagegevens, die gaan wel mee tijdens het klonen.
Git onderhoudt twee basis gegevens structuren, de object store en de index. Deze repository gegevens worden opgeslagen in de root van je werkmap in de verborgen .git map.
Git object typen
Het hart van de git repository is de object store.
Deze bevat de originele gegevens bestanden en alle log boodschappen, auteur informatie, datums en andere informatie die nodig is om een willekeurige tak van een project te herbouwen.
Git plaatst vier typen objecten in de object store: blobs, trees, commits en tags.
- Blobs
- Elke versie van een bestand wordt gepresenteerd als een blob. Blob is een samentrekking van Binary Large Object. Een blob bevat de gegevens van een bestand, maar niet de metagegevens of de naam van het bestand.
- Trees
- Een tree vertegenwoordigt een niveau van directory informatie. Een tree slaat blob identificatie, padnamen en wat metagegevens op voor alle bestanden in een directory. Een tree kan ook recursief andere objecten refereren en zo een complete hiërarchie bouwen van bestanden en subdirectories.
- Commits
- Een commit bevat metagegevens voor iedere verandering in de repository, inclusief de auteur, degene die de commit heeft uitgevoerd, commit datum en log boodschap. Iedere commit verwijst naar een tree object die de staat van de repository bevat ten tijde van de commit.
- Tags
- Een tag is een alternatieve, vriendelijker naam voor een object, meestal een commit.
De hoeveelheid informatie in de object store kan flink groeien. Om schijfruimte te besparen slaat git de objecten op in een samengepakt formaat in pack bestanden, deze worden ook in de object store opgeslagen.
De index
De index is een tijdelijk en veranderbaar binair bestand die de structuur van de directory van de hele repository beschrijft. De index bevat een versie van de gehele structuur van een project op een bepaald moment in de tijd. De staat van een project kan een commit en een tree van enig tijdstip in de geschiedenis van het project zijn, of het zou een toekomstige staat kunnen zijn waar je naar toe werkt.
Git stelt je in staat om de inhoud van de index aan te passen in logisch doordachte stappen. De index staat een scheiding toe tussen opeenvolgende ontwikkelingsstappen en de commit van die aanpassingen.
Via opdrachten als add, delete of het aanpassen van bestanden meldt je veranderingen aan de index. De index onthoudt en bewaart deze aanpassingen totdat je ze commit.
Voordat je ze commit kan je ook weer aanpassingen verwijderen uit de index (afmelden). Pas als alles naar wens is, voer je een commit uit.Wanneer je werkt met een algemeen version control system, dan bewerk je je bestanden in je werkmap en commit je de veranderingen naar je repository om ze veilig te stellen.
Zo werkt git ook, maar git voegt hier nog een laag aan toe tussen je werkmap en de repository, de index, waar je veranderingen aanmeldt (via add).Als je je code met git beheert, dan werk je in je werkmap, verzamel je de veranderingen in de index door ze aan te melden (via add) en commit je alles in een keer als een enkele aanpassing naar de repository.
Het aanmelden van allerlei aanpassingen naar de index is een stap die ervoor zorgt dat je steeds een aantal aanpassingen als een geheel via één commit naar de repository kan sturen.
Een verandering in je werkmap die niet is aangemeld, kan niet worden gecommit.
Je kan het aanmelden en committen wel combineren als je een nieuw bestand toevoegt of een bestaand bestand hebt aangepast:
git commit bestandsnaam
Als je een bestand verwijdert, dan moet dat wel in twee stappen:
git rm bestandsnaam
git commit
De index in git bevat geen bestandsinhoud, het houdt alleen bij wat je wilt committen.
Als je een commit uitvoert, dan kijkt git naar de index om te zien wat er ge-commit moet worden. Via git status krijg je te zien wat er is aangemeld in de index.
Git volgt inhoud
Ieder object in de object store heeft een unieke naam die ontstaat door een hash van de inhoud van het object te nemen. Dit wordt de object id genoemd. Objecten met gelijke grootte en inhoud zullen dezelfde hash hebben.
Objecten in de object store gebruiken de hash van het bestand als bestandsnaam. Als twee bestanden in verschillende directories dezelfde inhoud hebben, dus ook dezelfde hash hebben, dan wordt dit bestand slechts eenmaal opgeslagen in de object store. Zodra een van die bestanden wordt aangepast, krijgt het bestand een andere hash en wordt het met die hash als bestandsnaam opgeslagen in de object store. Het originele onaangepaste bestand staat dan ook nog in de object store en verwijst naar het niet aangepaste bestand in de andere directory. Git slaat alleen hele bestanden op, niet de verschillen tussen bestanden, git moet namelijk steeds de hash berekenen van het bestand, daarvoor is het hele bestand nodig.
De oorspronkelijke namen van bestanden en de paden die bij de objecten horen zijn voor git gegevens die onafhankelijk van de inhoud worden bewaard.
De hash functie geeft met dezelfde invoer altijd hetzelfde resultaat. Twee gelijke bestanden hebben daarom dezelfde hash. De hash kan daarom ook gebruikt worden om bestanden te vergelijken.
3 soorten bestanden
Voor git zijn er drie soorten bestanden in je werkmap: tracked, untracked en ignored.
Tracked bestanden zijn bestanden die zijn aangemeld voor de index en die git volgt.
Ignored bestanden zijn bestanden die met opzet niet mee moeten, ze zijn afgemeld (invisible verklaart) of ze staan in het .gitignore bestand. Dit gaat bijvoorbeeld om tijdelijke of kladbestanden.
Untracked bestanden zijn bestanden die nog niet zijn aangemeld voor de index, via
git add bestandsnaam
kunnen ze worden aangemeld.