0%

Dingen ongedaan maken · oefening

Ik heb iets verkeerd gecommit en anderen hebben het misschien al

Je hebt iets gecommit en het was verkeerd. Deze keer geen typefout in het bericht: de wijziging zelf had niet gemaakt moeten worden. Misschien heb je die commit al gedeeld en heeft iemand anders hem.

Er zijn twee manieren om een commit ongedaan te maken. Daartussen kiezen is de echte vaardigheid. De opdrachten zijn het gemakkelijke deel. Het diagram vraagt in welke toestand de wijziging zit (WHAT STATE IS THE CHANGE IN?) en adviseert de kleinste herstelbewerking (CHOOSE THE SMALLEST UNDO). Een werkbestand (WORKING FILE) zet je terug met git restore; een klaargezette kopie (STAGED COPY) haal je met git restore --staged uit staging. Bij een privécommit (PRIVATE COMMIT) verplaatst git reset de branch terug. Bij een gedeelde commit (SHARED COMMIT) voegt git revert een herstelcommit toe. Een verloren verwijzing (LOST POINTER) zoek je met git reflog terug. De onderste regel, RESET REWRITES / REVERTS ADD, vat samen: reset herschrijft en revert voegt toe.

Een keuzediagram koppelt werkbestanden, klaargezette kopieën, privécommits, gedeelde commits en verloren verwijzingen aan git restore, git restore --staged, git reset, git revert en git reflog.

Maak eerst de fout

Je hebt een verkeerde commit nodig voordat je er een ongedaan kunt maken. De vorige lessen hebben route.txt al hersteld en scratch.tmp veilig untracked gelaten. Verander het begin van de route in een plek waar die niet begint en commit dat alsof het klopt:

nano -w route.txt

Verander de eerste regel in Start: Whitehaven. Sla op met Ctrl-O, Enter en verlaat nano met Ctrl-X, precies zoals in hoofdstuk 2. Commit het daarna:

git add route.txt
git commit -m "Correct the start of the route"
git log

De wandeling begint niet in Whitehaven. Die commit moet ongedaan worden gemaakt.

De vraag die de methode bepaalt

Beantwoord één vraag voordat je een opdracht kiest:

Heeft iemand anders deze commit?

Zo niet, dan mag je je geschiedenis vrij herschrijven. Dat is wat git reset doet en waarvan je bij amend al een kleinere versie zag.

Zo ja, dan is herschrijven het verkeerde middel. De kopie van de geschiedenis bij die ander bevat nog de commit die jij uit de jouwe verwijderde. Ze komen niet meer overeen. Dat uitzoeken kost een vervelende middag en is te voorkomen.

Als iemand anders de commit misschien heeft, verwijder je hem niet. Je voegt een nieuwe commit toe die de wijziging ongedaan maakt. Beide blijven in de geschiedenis. Dat doet git revert.

Maak het ongedaan door toe te voegen

git revert --no-edit HEAD
git log
git status

git revert neemt een commit en maakt een nieuwe commit met precies de omgekeerde wijzigingen. HEAD duidt de nieuwste commit aan, die je net maakte. --no-edit accepteert het standaardbericht dat Git voorstelt: het woord Revert met het oorspronkelijke bericht tussen aanhalingstekens. Er opent dan geen editor om zelf een bericht te schrijven.

git log toont nu beide commits: de verkeerde en de revert die hem ongedaan maakte. In het bestand staat weer Start: Ravenglass. git status meldt geen klaargezette of gewijzigde bijgehouden bestanden. Het privébestand scratch.tmp staat er nog als untracked, veilig buiten beide commits.

Die dubbele vermelding is geen rommel. Het is een eerlijk verslag: dit is gedaan, daarna ongedaan gemaakt, en dit is wanneer. Wie de eerste commit al had, ontvangt de tweede en komt in dezelfde toestand als jij.

Wat dit vernietigt en wat niet

git revert voegt een nieuwe commit aan de geschiedenis toe in plaats van een bestaande te herschrijven. Je bereikbare geschiedenis wordt langer, de oorspronkelijke commit blijft bestaan en de kopie van iemand anders blijft geldig. Precies daarom is dit de juiste keuze voor gedeeld werk.

De keerzijde is dat de fout zichtbaar blijft in de gedeelde geschiedenis, naast de bewerking die haar ongedaan maakt. Sommige mensen vinden dat vervelend. Het is de prijs om de repository van iemand anders heel te houden, en die is het waard.

Je hebt gisteren een commit gedeeld en een collega heeft hem al. Vandaag merk je dat hij verkeerd was. Welke opdracht kies je?

Hierna: de situatie waarin je werk verdwenen lijkt.