In deze tutorial leer je de basisprincipes van het versiecontrolesysteem git kennen.
Een uitgebreidere versie van deze tutorial kan je terugvinden in het Git Book.
Een videoversie van deze tutorial is beschikbaar:
Git is een Version Control System. Een Git-repository is een bestandensysteem waarin verschillende versies van éénzelfde bestand bewaard kan worden.
Bijna alle programmeerprojecten ter wereld maken gebruik van Git. Met Git kan je:
- eenvoudig bestanden delen;
- op meerdere machines aan hetzelfde project werken;
- met meerdere mensen aan hetzelfde project werken;
- oude versies van bestanden terug ophalen;
- grote wijzigingen maken in aparte vertakkingen van het project zonder daarbij het hoofdproject te moeten wijzigien;
- bijhouden hoeveel regels code elk lid van een team bijgedragen heeft;
- nog veel meer.
Git is een technologie die je best vroeg in je opleiding onder de knie krijgt. Het is dus een sterke aanrader deze tutorial te volgen.
GitHub is een website van Microsoft waar Git-repositories gratis gehost kunnen worden. Je kan een repository laten aanmaken op de server van GitHub en deze eenvoudig delen met anderen.
Het is ook mogelijk je eigen GitHub-repository te hosten op een eigen server. Dat zal niet behandeld worden in deze tutorial.
Als eerste stap van deze tutorial maken we een repository aan op GitHub:
- Maak een account op GitHub.
- Druk rechtsboven op het +-icoon en klik op New repository.
- Geef de repository de naam oefenrepo
- Kies zelf of je de repository publiek of privaat maakt.
- Vink de optie Add a README file aan
- Maak de repository aan
Vervolgens kom je op de pagina van de repository terecht. Op deze pagina zie je een overzicht van het bestandensysteem en wordt de README file weergegeven.
Onze repository heeft een URL waarmee we deze kunnen importeren op onze eigen machine.
- Druk op de groene knop met Code rechtsboven op de pagina van de repository
- Selecteer HTTPS en kopieer de link in het vakje. Deze heeft typisch het formaat
https://github.com/<gebruikersnaam>/<repository-naam>.git
.
De allereerste keer dat je git gebruikt moet je je naam en e-mailadres instellen.
- Open een terminal
- Voer onderstaande commando's uit. Vervang Jan Timmersmans door je eigen naam en het e-mailadres door je eigen e-mail.
git config --global user.name "Jan Timmermans"
git config --global user.email "[email protected]"
Met behulp van git clone
kunnen we een lokale kopie maken van onze repository. Vervolgens kunnen we bestanden toevoegen, wijzigen of verwijderen.
-
Open een terminal
-
Maak een lokale kopie van je repository met
git clone
. Gebruik hiervoor je eigen URL.git clone https://github.com/<gebruikersnaam>/oefenrepo.git
Het uitvoeren van dit commando maakt een nieuwe folder aan met de naam van de repository, in dit geval oefenrepo.
-
Navigeer naar de repository-folder met
cd
.cd oefenrepo
Alle volgende stappen in de tutorial nemen aan dat de working directory van je terminal de folder van je repository is. Dit kan je verifiëren met met het commando pwd
-
Open het bestand
README.md
in een editor naar keuze.nano README.md
-
Bewerk de README met een boodschap naar keuze.
We hebben een bestand in onze repository gewijzigd. Deze wijzigingen zijn enkel doorgevoerd op onze eigen machine. Wanneer we tevreden zijn met onze aanpassingen moeten we Git de nieuwe versie van het bestand laten bewaren.
-
Voer het commando
git add <filename>
uit om aan Git te laten weten voor welk bestand we wijzigingen willen bewaren.git add README.md
-
Voer het commando
git commit -m "<boodschap>"
uit om de wijzigingen te bewaren. In de boodschap beschrijf je welke wijzigingen er zijn doorgevoerd.git commit -m "Bericht aan README toegevoegd."
Op dit moment zijn de wijzigingen correct bewaard in je lokale repository. Wanneer je naar je repository-pagina surft zal je echter merken dat daar nog steeds de oude versie van het README-bestand staat.
-
Gebruik
git push
om de lokale wijzigingen naar de remote repository pushen.git push origin main
Ververs nu de webpagina van je repository op GitHub. De nieuwe inhoud van je README-bestand zou daar nu ook zichtbaar moeten zijn.
Nieuwe bestanden toevoegen aan een repository gebeurt op dezelfde wijze als het bewerken van bestaande bestanden.
-
Maak twee nieuwe lege bestanden aan
touch file1 touch file2
-
Voer het commando
git status
uit. Git toont je datfile1
enfile2
nog niet getracked worden.git status
-
Track deze files in je repository met
git add
git add file1 file2
-
Bewaar de nieuwe bestanden in de repository met
git commit
.git commit -m "Twee lege bestanden toegevoegd"
-
Gebruik
git push
om de remote repository te synchroniseren met je lokale repositorygit push origin main
In een repository met meerdere gebruikers kan je de wijzigingen die anderen gepushet hebben opvragen met behulp van het commando git pull
.
In deze tutorial werk je alleen, dus zal het onderstaande commando geen effect hebben.
git pull origin main
Elke commit in de repository bewaart wijzigingen in één of meerdere bestanden. Elke wijziging kan ook ongedaan gemaakt worden. Een commit wordt geïdentificeerd door een unieke code van 40 karakters.
-
Bekijk met behulp van het commando
git log
de geschiedenis van je commits.git log
-
Kopieer de commit hash van de eerste commit in je repository uit de log.
-
Herstel de eerste versie van
README.md
metgit checkout
.git checkout <commit-hash> -- README.md
-
Verifieer dat de oude versie van
README.md
hersteld is door de inhoud van het bestand te bekijkencat README.md
-
Gebruik
git log
engit checkout
om de nieuwste versie van het bestand terug te herstellen. Gebruik hiervoor de hash van de nieuwste commit.git log git checkout <commit-hash> -- README.md
-
Verifieer dat de nieuwste versie van
README.md
hersteld is door de inhoud van het bestand te bekijkencat README.md
Een git-repository is intern gestructureerd door middel van branches. Elke repository heeft een master-branch die kan beschouwd worden als de stam van je repository. Hierop vind je vaak de meest recente werkende versies van software-projecten.
Wanneer een developer een functionaliteit gaat toevoegen aan een project, maakt deze hiervoor een nieuwe tak (branch) aan. Wijzigingen op deze tak gebeuren afzonderlijk van de wijzigingen op de master.
Door gebruik te maken van een branch kan een developer code aanpassen, committen en pushen zonder bang te moeten zijn dat hij hierdoor werk van anderen stuk kan maken.
Typisch worden branches aangemaakt voor nieuwe functionaliteiten. Wanneer deze functionaliteit klaar is wordt de branch samengevoegd met de master-branch. Dit proces heet mergen.
-
Maak een branch genaamd
readme-wijzigen
aan met behulp van hetgit branch
commandogit branch readme-wijzigen
-
Switch naar de branch die je net hebt aangemaakt
git checkout readme-wijzigen
-
Wijzig het bestand
README.md
naar keuzenano README.md
-
Commit de wijzigingen naar de huidige branch
git add README.md git commit -m "README aangepast"
-
Switch terug naar de master-branch met
git checkout
git checkout main
-
Verifieer dat
README.md
op de main branch niet is aangepastcat README.md
-
Voeg
readme-wijzigingen
toe aan de main branch metgit merge
git merge readme-wijzigingen
-
Verifieer dat
README.md
op de main branch nu wel is aangepastcat README.md
Soms gebeurt het dat meerdere ontwikkelaars op hetzelfde moment in een bestand aan het werken zijn. Neem het volgende scenario
- Ontwikkelaar A en B clonen een repository met bestand X
- Ontwikkelaar A wijzigt bestand X: X1
- Ontwikkelaar B wijzigt bestand X: X2
- Ontwikkelaar A pusht X1 naar de remote repository
- Ontwikkelaar B probeert X2 te pushen naar de remote repository
In stap 5 zal Git een melding geven aan ontwikkelaar B dat er een nieuwere commit van een andere ontwikkelaar aanwezig is in de remote repository. Hij kan zijn bestand niet pushen.
- Ontwikkelaar B voert
git pull origin main
uit
Git detecteert nu twee versies van bestand X: X1 en X2. In eerste instantie probeert Git deze bestanden automatisch samen te voegen. Wanneer dit niet, heb je een merge conflict.
Op dit moment maakt Git een bestand X3 aan. De plaatsen in het bestand waar Git geen automatische merge kon uitvoeren staan in X3 gemarkeerd door markers die er als volgt uitzien:
$ cat README.md
<<<<<< HEAD:README.md
Readme van ontwikkelaar B
=======
Readme van ontwikkelaar A
>>>>>> master:README.md
De bedoeling is dat ontwikkelaar B nu voor elk conflict in het bestand kiest welke versie bewaard moet worden. Dit kiest hij door de markers te verwijderen en telkens de correcte versie te kiezen. Hij zou het bestand bijvoorbeeld kunnen wijzigen naar:
$ cat README.md
Readme van ontwikkelaar A en B
Wanneer de conflicts opgelost zijn kan developer B zijn wijzigingen committen en pushen:
git commit -m "Resolved merge conflict on README"
git push origin main