Dingen ongedaan maken · oefening
Mijn laatste commitbericht klopt niet of ik ben een bestand vergeten
Je hebt een minuut geleden een commit gemaakt die niet klopt. Misschien zegt het bericht niets nuttigs, of wilde je een bestand opnemen en ben je dat vergeten. De commit staat nog alleen op jouw computer.
Git kan die commit vervangen door een betere. De kanttekening zit in het woord vervangen. Deze les gaat net zo goed over wanneer je dit gebruikt als over hoe.
Lees wat je werkelijk hebt gecommit
git log
git status
Twee problemen. De nieuwste commit heeft het bericht update, waar een toekomstige lezer niets aan heeft. En packing.txt, een lijst met wandelschoenen, kaart en kompas, staat er untracked naast. Dat bestand had erbij gemoeten.
Los beide in één keer op
git commit --amend vervangt de nieuwste commit door een nieuwe, opgebouwd uit wat nu is klaargezet, met een bericht dat je meegeeft.
Lees dat nog eens, want dit is de valkuil: alles wat is klaargezet gaat erin, niet alleen het bestand dat je net toevoegde. Een bestand dat je een uur geleden klaarzette en vergat, wordt zo onderdeel van een commit waarvan het bericht er niets over zegt.
Maak er daarom een gewoonte van eerst te kijken, voordat je amend gebruikt. git status bovenaan deze les toont scratch.tmp na de vorige les veilig als untracked en niets in de staging area. Dat is een veilige beginsituatie. Zet alleen het vergeten bestand klaar en vervang de commit:
git add packing.txt
git commit --amend -m "Add the packing list and the ranger note"
git log
git status
git add packing.txt zet het bestand klaar, precies zoals bij een gewone commit. Daarna maakt git commit --amend een commit van de klaargezette inhoud en gebruikt die in plaats van de vorige, niet erna. -m geeft het nieuwe bericht mee, net als bij een gewone commit.
git log toont nu het betere bericht en het aantal commits is niet gestegen. git status noemt packing.txt niet meer, omdat het is gecommit in plaats van untracked ernaast te liggen.
git status is echter niet leeg, en dat hoort zo. scratch.tmp staat er nog als untracked bestand, precies waar je het in de vorige les achterliet. Je haalde het uit de staging area; je verwijderde het niet. Het is niet samen met packing.txt in de vervangende commit terechtgekomen.
Wat dit vernietigt en wat niet
De oude commit wordt niet bewerkt. Git bewerkt geen commits. Er wordt een nieuwe gemaakt met andere inhoud en je branch wordt verplaatst om ernaar te wijzen. Geen branch wijst naar het origineel, al blijft het via de reflog nog een tijd herstelbaar.
Dat is om twee redenen van belang. Daarom groeit het aantal commits niet. En daarom is dit hier veilig: je verliest niets waarvan je niet al had besloten het te vervangen. Zelfs de verlaten commit is nog een tijd terug te vinden. Daar gaat de laatste les van dit hoofdstuk over.
De echte grens gaat niet over veiligheid, maar over andere mensen:
Gebruik amend alleen voor een commit die niemand anders heeft. Zodra iemand anders je commit heeft, zorgt vervangen ervoor dat diegene de ene geschiedenis heeft en jij een andere. Die twee moeten dan met de hand weer op elkaar worden afgestemd.
Hier is de commit nog privé, dus vervangen is passend. De volgende les houdt die voorwaarde vast, maar verandert de taak: haal de nieuwste commit uit de branch terwijl je het werk bewaart.
Je gebruikt amend op je nieuwste commit om het bericht te verbeteren. Wat toont git log daarna?
Hierna: een privécommit terugnemen zonder zijn bestandswijzigingen weg te gooien.