Wat zijn de drie bomen in Git?

Git is het meest gebruikte systeem voor versiebeheer en deelcode geworden. Als je wilt helpen bij het bouwen van open-source software of als je in een professioneel team wilt werken, is het begrijpen van Git een must.

In een serie Git-cursussen over Envato Tuts + heb ik enkele van de kerngit-concepten uitgelegd, allemaal geïllustreerd met behulpzame animaties.

In deze video leert u over de drie bomen: de HEAD, de index en de werkdirectory. Kijk hoe ik de rol van elk uitleg en hoe ze met elkaar omgaan tijdens het updaten en committen van code.

Git Basics: The Three Trees

 

Wat zijn de drie bomen?

Om beter te begrijpen hoe Git werkt, kunnen we de metafoor van de drie bomen gebruiken. Deze bomen zijn verschillende verzamelingen bestanden. 

Voor de workflow van het toevoegen en ophalen van commits, gebruikt Git drie verschillende versies van bestanden:

  1. de werkdirectory
  2. de index
  3. iets dat "HEAD" wordt genoemd voor het maken en voor het ophalen van commits

Elk van deze bomen heeft een andere taak: één boom om wijzigingen te schrijven, één boom om ze te rangschikken, en één om naar je laatste commit op een tak in je Git-repo te wijzen. 

Verschillende versies van bestanden

Bestanden waarvan de inhoud kan worden gewijzigd, bevinden zich in uw werkdirectory. Bestanden die in uw index zijn geplaatst, worden voorbereid om te worden verpakt in een commit-object. Deze commits worden opgeslagen in je Git-repository. 

Bestanden die al zijn vastgelegd, zijn gecomprimeerde bestanden. Ze worden gehasht door een SHA-1, een cryptografische hash-functie. Beide bestandsversies in de index en commit zelf worden opgeslagen in de Git-repo, wat gewoon een .git rectory is op het rootniveau van je wrap.

De werkmap vertegenwoordigt de werkelijke bestanden op het bestandssysteem van uw computer die beschikbaar zijn voor uw code-editor om wijzigingen toe te passen. De werkdirectory is een versie van een bepaalde commit, een specifieke momentopname van een project dat u hebt uitgecheckt. Het is de versie van je Git-geschiedenis waar HEAD naar verwijst, op elk moment.

"Uitgecheckt" betekent dat u de gedecomprimeerde versies van bestanden hebt die uit uw Git-repository zijn gehaald en beschikbaar zijn voor bewerking. De index vertegenwoordigt wat wordt bijgehouden. Je zou ook kunnen zeggen dat het een lijst is van alle bestanden die relevant zijn voor je Git-repository. 

De index gaat langs een aantal namen. Wanneer mensen het hebben over het staginggebied, de gefaseerde bestanden, het cachegeheugen of de directorycache, hebben ze het allemaal over de index. Je kunt de index zien als de draftzone voor je volgende commit, een tijdelijk gebied om de volgende commit voor te bereiden. 

HOOFD

HEAD is het deel van git dat naar je takken wijst, zoals standaard de mastertak. Het is een referentie en het heeft een vrij eenvoudige maar enorm belangrijke taak. HEAD verwijst naar de momenteel uitgecheckte vertakking en die wijst op zijn beurt terug naar de laatste commit van die tak. HEAD kan niet alleen in de tijd bewegen (wanneer u eerdere commits bekijkt), maar het beweegt ook wanneer u nieuwe branches creëert of eenvoudig overschakelt naar andere branches.

Het is ook het punt in je Git-geschiedenis dat je je volgende commit kunt plaatsen, de ouder voor je volgende commit. Bij elke nieuwe commit vervangt het de referentie naar de branch die momenteel is uitgecheckt standaard, de master branch, natuurlijk. 

Dus, in feite is HEAD een referentie die vaak verandert en wijst naar twee dingen: de branch zelf, en daarmee de laatste commit op die branch. 

Git's bestandswerkstroom 

Laten we de workflow van het omgaan met bestanden in Git van naderbij bekijken. Het is essentieel om te begrijpen hoe al deze stukjes bij elkaar passen. In Git zul je een veel gemakkelijkere tijd hebben om meer geavanceerdere functies en concepten te begrijpen.

Hier is een voorbeeld:

In dit voorbeeld hebben we twee versies van ons bestand vastgelegd. En je ziet dat de versies in de repo, de index en de werkdirectory hetzelfde zijn. Omdat deze bestanden al worden bijgehouden, zal Git eventuele verschillen opmerken wanneer u een van deze bijgehouden bestanden in de werkdirectory wijzigt.

Wanneer u de git status opdracht, ziet u een lijst met bestanden die zijn gewijzigd, rood gekleurd. Dit geeft aan dat je verschillen hebt tussen je werkdirectory - vertegenwoordigd door de code in je code-editor - en je index, die versies van bestanden van een bepaalde commit vertegenwoordigt, meestal de laatste commit.

U kunt nu de git add opdracht om deze wijzigingen uit de werkdirectory in de index te plaatsen waar u de bestanden hebt geënsceneerd. git status toont vervolgens de bestanden die zijn toegevoegd aan de index groen gekleurd. Dit betekent dat je veranderingen klaar zijn om te worden verpakt in een nieuwe commit, waar HEAD op kan wijzen en daarop kan bouwen.

Een groene lijst met bestanden betekent simpelweg dat de versies van de gefaseerde bestanden in de index verschillen van de versies van bestanden die al eerder zijn vastgelegd. Wanneer je rent Git commit, deze gefaseerde bestanden worden in een nieuw commit-object geplaatst. De Git commit commando zal de eigenlijke bestandsnamen, de inhoud van elk bestand, auteursinformatie, metadata en dergelijke in een nieuw object opslaan.

Dit commit-object, dat nu in een .git map in uw repository, zal de nieuwe referentie zijn waar HEAD naar verwijst. Het verwijst naar vorige commits, op de een of andere manier het topje van de ijsberg. Nadat we ons commit-object hebben gemaakt, staan ​​we weer aan het begin van de cyclus.

De commit waarnaar HEAD verwijst in de repo komt opnieuw overeen met de versies in de index en de werkdirectory, die gereed is voor nieuwe veranderingen die moeten worden geënsceneerd en vastgelegd. Einde verhaal.

Bekijk meer Git-cursussen

Als je dit nuttig vond, waarom zou je dan niet wat meer Git-cursussen bekijken??

Je kunt onze inleiding tot Git en GitHub bekijken of de andere koffiepauzecursussen in deze serie proberen:

  • Git Basics: Reset
  • Git Basics: GitHub Pull Requests
  • Git Basics: Branches
  • Git Basics: Staten
  • Git Basics: samenvoegen en rebasen