Close

git revert

De opdracht git revert kan worden beschouwd als een soort 'ongedaan maken'-opdracht, maar is geen traditionele bewerking om iets ongedaan te maken. In plaats van de commit uit de projectgeschiedenis te verwijderen, wordt er gezocht naar manieren om de wijzigingen die door de commit zijn aangebracht ongedaan te maken. Ook wordt er een nieuwe commit toegevoegd met de 'teruggezette' inhoud die daaruit voortkomt. Dit voorkomt dat git geschiedenis verliest, wat belangrijk is voor de integriteit van je revisiegeschiedenis en voor betrouwbare samenwerking.

Gebruik 'terugdraaien' als je het omgekeerde van een commit uit je projectgeschiedenis wilt toepassen. Dit kan bijvoorbeeld handig zijn als je een bug aan het opsporen bent en ontdekt dat deze door één enkele commit is geïntroduceerd. In plaats van er handmatig in te duiken, de bug te repareren en een nieuwe snapshot te committen, kun je git revert gebruiken om dit allemaal automatisch voor je te doen.


Hoe het werkt


De opdracht git revert wordt gebruikt om wijzigingen in de commitgeschiedenis van een repository ongedaan te maken. Andere 'ongedaan maken'-opdrachten, zoals git checkout en git reset, verplaatsen de verwijzingen naar HEAD en branches naar een specifieke commit. Git revert vereist ook een specifieke commit, maar git revert verplaatst geen referentieverwijzingen naar deze commit. Bij een bewerking om iets terug te zetten wordt de opgegeven commit gebruikt. Ook worden de wijzigingen ten opzichte van die commit teruggezet en wordt er een nieuwe 'revert commit' aangemaakt. De referentieverwijzingen worden vervolgens zo bijgewerkt dat ze verwijzen naar de nieuwe 'revert commit', waardoor deze de tip van de branch vormt.

Laten we, om dit te demonstreren, een voorbeeldrepo aanmaken aan de hand van de onderstaande opdrachtregelvoorbeelden:

$ mkdir git_revert_test
$ cd git_revert_test/
$ git init .
Initialized empty Git repository in /git_revert_test/.git/
$ touch demo_file
$ git add demo_file
$ git commit -am"initial commit"
[main (root-commit) 299b15f] initial commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 demo_file
$ echo "initial content" >> demo_file
$ git commit -am"add new content to demo file"
[main 3602d88] add new content to demo file
n 1 file changed, 1 insertion(+)
$ echo "prepended line content" >> demo_file
$ git commit -am"prepend content to demo file"
[main 86bb32e] prepend content to demo file
 1 file changed, 1 insertion(+)
$ git log --oneline
86bb32e prepend content to demo file
3602d88 add new content to demo file
299b15f initial commit
Git-logo
gerelateerd materiaal

Git cheat sheet

Logo Bitbucket
Oplossing bekijken

Git leren met Bitbucket Cloud

We hebben een repo geïnitialiseerd in een nieuw aangemaakte map met de naam git_revert_test. We hebben 3 commits gemaakt naar de repo, waarbij we een bestand demo_file hebben toegevoegd en de inhoud ervan twee keer hebben aangepast. Aan het einde van de procedure voor het instellen van de repo roepen we git log aan om de commit-geschiedenis weer te geven. Deze bevat in totaal 3 commits. Nu de repo zich in deze staat bevindt, zijn we klaar om een git revert te starten.

$ git revert HEAD
[main b9cd081] Revert "prepend content to demo file" 1 file changed, 1 deletion(-)

Git revert verwacht dat er een commit-ref is doorgegeven en wordt niet uitgevoerd als daar geen sprake van is. Hier hebben we de HEAD-ref ingevoerd. Deze maakt de laatste commit ongedaan. Dit is hetzelfde gedrag als wanneer we zouden terugkeren naar commit 3602d8815dbfa78cd37cd4d189552764b5e96c58. Net als bij een samenvoeging wordt bij een revert een nieuwe commit aangemaakt, waardoor de geconfigureerde systeemeditor wordt geopend waarin om een nieuw commit-bericht wordt gevraagd. Zodra een commit-bericht is ingevoerd en opgeslagen, zal Git de bewerking hervatten. We kunnen nu de status van de repo onderzoeken met git log en zien of er een nieuwe commit is toegevoegd aan het vorige logboek:

$ git log --oneline 1061e79 Revert "prepend content to demo file" 86bb32e prepend content to demo file 3602d88 add new content to demo file 299b15f initial commit

Merk op dat de derde commit na de terugkeer nog steeds in de geschiedenis van het project staat. In plaats van deze te verwijderen, heeft git revert een nieuwe commit toegevoegd om de wijzigingen ongedaan te maken. Als gevolg hiervan vertegenwoordigen de tweede en vierde commit exact dezelfde codebasis. De derde commit staat nog steeds in onze geschiedenis voor het geval we er later op terug willen komen.

Gemeenschappelijke opties


-e
--edit

Dit is een standaardoptie, die niet gespecificeerd hoeft te worden. Met deze optie wordt de geconfigureerde systeemeditor geopend en word je gevraagd het commit-bericht te bewerken voordat je de terugdraai-commit maakt

--no-edit

Dit is het omgekeerde van de optie -e. Bij het terugzetten wordt de editor niet geopend.

-n
--no-commit

Als je deze optie overslaat, voorkom je dat git revert een nieuwe commit aanmaakt die de doelcommit omkeert. In plaats van de nieuwe commit aan te maken, worden met deze optie de omgekeerde wijzigingen toegevoegd aan de stage-index en de werkmap. Dit zijn de andere structuren die Git gebruikt om de status van de repository te beheren. Ga voor meer informatie naar de pagina over git reset.

Resetten versus terugzetten


Het is belangrijk om te begrijpen dat git revert een enkele commit ongedaan maakt. De vorige status van een project wordt niet teruggezet door alle volgende commits te verwijderen. In Git wordt dit eigenlijk een 'reset' genoemd in plaats van 'terugzetten'.

Diagram resetten versus terugdraaien

Terugdraaien heeft twee belangrijke voordelen ten opzichte van resetten. Ten eerste verandert dit niets aan de projectgeschiedenis, waardoor het een 'veilige' bewerking is voor commits die al in een gedeelde repository zijn gepubliceerd. Meer informatie over waarom het wijzigen van gedeelde geschiedenis gevaarlijk is, vind je op de pagina over git reset.

Ten tweede kan git revert worden gebruikt voor een individuele commit op een willekeurig punt in de geschiedenis, terwijl git reset alleen achterwaarts kan werken vanaf de huidige commit. Als je bijvoorbeeld een oude commit ongedaan wilt maken met git reset, dan zou je alle commits moeten verwijderen die plaatsvonden na de doelcommit en vervolgens alle volgende commits opnieuw moeten maken. Onnodig te zeggen dat dit geen elegante oplossing is om de commit ongedaan te maken. Raadpleeg Opnieuw instellen, uitchecken en terugdraaien voor een meer gedetailleerde discussie over de verschillen tussen git revert en andere 'undo'-opdrachten.

Samenvatting


De opdracht git revert werkt voorwaarts en biedt een veilige methode om wijzigingen ongedaan te maken. In plaats van commits uit de commitgeschiedenis te verwijderen of los te koppelen, maakt een terugdraaibewerking een nieuwe commit aan die de gespecificeerde wijzigingen omkeert. Git revert is een veiliger alternatief voor git reset wat betreft het verliezen van werk. Om de effecten van git revert aan te tonen, hebben we gebruikgemaakt van andere opdrachten met meer gedetailleerde documentatie op hun afzonderlijke pagina's: git log, git commit en git reset.


Deel dit artikel
Volgend onderwerp

Aanbevolen artikelen

Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.

Mensen die samenwerken met een muur vol tools

Bitbucket-blog

Toelichting DevOps

DevOps-leertraject

Demo Den Feature-demo's met Atlassian-experts

Hoe Bitbucket Cloud werkt met Atlassian Open DevOps

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up