Git en GitHub – terughalen vorige versie
Inleiding
![](https://www.mrasoft.nl/wp-content/uploads/2021/04/SourceOnGitHub.png)
Het doel van een versiebeheersysteem (VCS = Version Control System) is dat we bestanden kunnen volgen zodat we weten of de bestanden zijn gewijzigd en wat er aan de bestanden is gewijzigd en wanneer.
Een versiebeheersysteem verliest echter snel aan bestaansrecht als de VCS niet gebruikt kan worden voor het doen terughalen van een vorige versie.
In deze post zullen we ingaan op het terughalen van een vorige versie waarbij alles op zowel de lokale PC als de remote repository staat via pull requests en de commit historie intact moet blijven en alle oude versies bewaard moeten blijven in de repositories.
Publieke of private situatie?
Er zijn twee situaties denkbaar voor wat betreft het terughalen van een vorige versie:
- Alle aanpassingen in de repository zijn public
In deze post verstaan we onder public dat alle aanpassingen al zijn gepushed naar de remote GitHub repository via pull requests.
Git heeft zijn commit historie en business partner GitHub heeft dat ook en beide partijen verlangen dat de commit historie van de zakenpartner synchroon blijft lopen met de eigen commit historie en dat geen historie verloren gaat. Voor het terughalen en het activeren van een vorige versie moet dan GitHub zelf of de git revert gebruikt. Dat is teruggevallen op een vorige versie, dat kan dan ook uit de historie herleid kan worden.
Personen die in hun local Git repository nog een versie hebben dat gebaseerd is op een oude versie komen zo doende ook niet in de problemen omdat alle oude versies bewaard blijven in de repositories.
~ - De aanpassingen in de repository zijn private
In deze post verstaan we onder private dat alle aanpassingen al zijn gecommit naar de local Git repository, maar verder nog niks is gepushed naar de remote GitHub repository. In zulke situaties kun je voor het doen terughalen van een vorige versie gebruik maken van de git reset.
Een ander scenario in een private situatie is dat je na een git reset een git push –force -u origin doet waarmee je de remote GitHub commit history overschrijft met de commit history van je lokale PC (git) en commit history van en versies in de remote GitHub repository verdwijnen.
Dat hoeft verder geen probleem te zijn als de remote repository private is en een afspiegeling mag blijven van je eigen PC en er verder geen andere mensen zijn die de repository hebben gedownload en afhankelijk zijn van versies in de remote repository. Zie deze post voor de “private” scenario’s.
~
Publieke situatie
In de vorige posts* over Git en GitHub hebben we gebruik gemaakt van deze GitHub-repository. We hebben een aantal nieuwe commits gedaan en alle aanpassingen zijn gepushed naar de remote GitHub repository.
De remote repository is public en de buitenwereld heeft daardoor ook weet van al die aanpassingen en we kiezen voor het terugzetten van een vorige versie voor een “public”-aanpak.
We zien dat de laatste üpdates allemaal betrekking hebben op de Indische keuken (Cendol, Kwee Mangkok, Risolles):
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/001_CommitsRepo-1024x536.jpg)
* Git en GitHub | Git en GitHub(2) | Git en GitHub – Merge Conflicts | Git en Github – terughalen vorige versie (2)
De lokale Git repository op de lokale PC is gesynchroniseerd met de GitHub remote repository en daar zien we de commits ook:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/002_Log-oneline-1-1024x509.jpg)
(in de bovenstaande printscreen hebben we ook de eerdere commits opgenomen die betrekking hebben op het heelal).
Maar eigenlijk willen we de laatste üpdates over de Indische keuken niet omdat we in de desbetreffende pagina (index.html) alleen maar zaken wensen op te nemen die betrekking hebben op het heelal.
We gaan voor de desbetreffende pagina een aantal zaken “terugdraaien” en dat kan (voor zover met “pull requests” is gewerkt) vanuit de GitHub website of vanuit de lokale PC met Git revert.
> GitHub
Het terugzetten van een eerdere versie via GitHub is de eenvoudigste manier. Voor bijvoorbeeld de risolles hadden we een aparte branche gemaakt met de naam risolles. De risolles hebben we gepushed naar de GitHub remote repository en met een pull request hebben we de risolles opgenomen in hoofdbranche master.
Van de risolles willen we af en dat laten we GitHub doen. We vragen of GitHub een revert-8-risolles-branche aanmaakt waarna we voor die revert-8-risolles-branche een pull request uitvoeren. Het gevolg is dat hoofdbranche master weer wordt bijgewerkt naar de situatie voordat de risolles er waren.
a)
we klikken op de eerdere pull request die we willen terugdraaien:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/004_klik-pull-request-1024x187.jpg)
b)
voor de pull request is er een Revert-button:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/005_revert-pull-request.jpg)
c)
we kiezen voor de creatie van een pull request voor branche revert-8-risolles:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/006_creatie-nieuwe-pull-request.jpg)
d)
het bijwerken van de hoofdbranche geeft geen problemen (geen merge conflicts of andere narigheid) en we doen de merge:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/007_merge-pull-request.jpg)
e)
we bevestigen alles:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/008_Bevestig-Merge.jpg)
f)
En de Pull Request is uitgevoerd waarbij we kiezen voor het verwijderen van de revert-8-risolles-branche omdat we die niet meer nodig hebben:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/009_Verwijder-merge-branch.jpg)
g)
We zien dat er commits bij zijn gekomen waaruit we kunnen herleiden wanneer we de risolles weggedaan hebben:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/010_NieuweBranches.jpg)
h) voor het bijwerken van de local Git repository doen we een:
git pull origin master
i)
de situatie voor de pull:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/011_index_html-before-1024x666.jpg)
j)
de situatie na de pull:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/012_index_html-after-1-1024x666.jpg)
En we hebben via GitHub een eerdere versie teruggezet waarbij we af zijn van de risolles. De tekst over risolles is niet meer.
> Git revert
We hebben via GitHub de risolles weggehaald, maar het kan ook vanuit de lokale PC met Git. We verwijderen de Kwee Mangkok met een git revert.
a)
de commit ID zoeken we op met:
git log --oneline
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/001_CommitID.jpg)
De commit ID waar het om gaat is ba22a06 want we willen af van de kweemangkok.
b)
we geven onderstaande Git-commando op:
git revert ba22a06 --no-edit -m 1
daarbij wordt met –no-edit de editor (default VIM) niet opgestart voor het doen ingeven van een commit message, we gebruiken de default die git voor ons verzint,
de -m 1 moeten we opgeven omdat de commit een merge is vanuit een andere branche en die branche is de directe parent (commit id 2174d6c, branche kweemangkok) van de merge.
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/002_Revert.jpg)
c)
We doen voor het doen bijwerken van de remote GitHub repository een:
git push origin master
d)
En we zien in GitHub dat er een commit bij is gekomen:
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/005_GitHubResultaat.jpg)
En we hebben met git revert een eerdere versie teruggezet waarbij we af zijn van de gestoomde cakejes. De tekst over Kwee Mangkok is niet meer.
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/006_GitHubResultaatDetails.jpg)
En we doen de hele exercitie nog een keer voor de Cendol en index.html is weer terug bij af. Er staan alleen nog maar zaken die betrekking hebben op het heelal, maar de historie met alles over de Indische keuken is bewaard gebleven.
![](https://www.mrasoft.nl/wp-content/uploads/2023/07/007_EnWegIsDeIndischeKeuken.jpg)
Slot
In deze post zijn we ingegaan op het doen terughalen van een vorige versie via je versiebeheersysteem. We zijn uitgegaan van een situatie dat alles op zowel de lokale PC als op een publieke remote repository staat via pull requests en de eis dat de commit historie intact moet blijven en alle oude versies bewaard moeten blijven in de repositories.
We hebben het één en ander toegelicht aan de hand van een index.html met versies waar via pull requests allemaal teksten aan zijn toegevoegd over Indische hapjes en snacks en we willen die teksten weg hebben uit index.html.
We kunnen een versie terugzetten met GitHub zelf of met de git revert. We zien dat we voor de git revert minder hoeven te doen, maar we moeten dan wel precies weten wat we aan het doen zijn en we moeten ook de juiste commit ID gebruiken om een oude versie teruggedraaid te krijgen.
Dan zou mijn voorkeur uitgaan naar GitHub zelf. Misschien dat je door wat meer schermen moet en op meerdere buttons moet klikken, maar het geheel oogt allemaal veel gebruikersvriendelijker en je ziet beter wat je aan het doen bent.
Er zijn inmiddels veel producten van derden (gitKraken, SourceTree, Tower etc.) met een gebruikersvriendelijke GUI waarmee je ook het één en ander voor elkaar kunt krijgen, maar dat valt allemaal buiten de scope van deze post.
Hopelijk ben je met deze posting weer wat wijzer geworden en ik hoop je weer terug te zien in één van mijn volgende blog posts. Klik op de Home-button om te zien wat ik nog meer geschreven heb…