Hoe maak ik de meest recente lokale commits ongedaan in Git?

Ik heb per ongeluk de verkeerde bestanden gecommit naar Git, maar ik heb de commit nog niet naar de server gepushed.

Hoe kan ik die commits ongedaan maken vanuit de lokale repository?

Oplossing

Een commit ongedaan maken en opnieuw doen

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Dit is wat je ongedaan wilt maken.
  2. Dit doet niets met je werkboom (de staat van je bestanden op schijf), maar maakt de commit ongedaan en laat de veranderingen die je gecommit hebt onge-staged (dus ze'zullen verschijnen als "Changes not staged for commit" in git status, dus je'zult ze opnieuw moeten toevoegen voordat je gaat committen). Als je alleen meer wijzigingen aan de vorige commit wilt toevoegen, of de commit boodschap wilt veranderen1, dan kun je in plaats daarvan git reset --soft HEAD~ gebruiken, wat net zoiets is als git reset HEAD~2 maar je bestaande wijzigingen ge-staged laat.
  3. Breng correcties aan in de bestanden in de werkboom.
  4. git add alles wat je in je nieuwe commit wilt opnemen.
  5. Commit de veranderingen, waarbij je de oude commit boodschap hergebruikt. reset heeft de oude kop naar .git/ORIG_HEAD gekopieerd; commit met -c ORIG_HEAD zal een editor openen, die in eerste instantie de log boodschap van de oude commit bevat en je toestaat om het te bewerken. Als je het bericht niet hoeft te bewerken, kun je de -C optie gebruiken.

Let er echter op dat als je nieuwe wijzigingen aan de index hebt toegevoegd, het gebruik van commit --amend deze aan je vorige commit zal toevoegen.

Als de code al naar je server is gepushed en je hebt rechten om de geschiedenis te overschrijven (rebase) dan:

git push origin master --force

Je kunt ook naar dit antwoord kijken:

https://stackoverflow.com/questions/34519665/how-to-move-head-back-to-a-previous-location-detached-head/34519716#34519716

Het bovenstaande antwoord toont je git reflog dat wordt gebruikt om uit te zoeken wat de SHA-1 is waarnaar je wilt terugdraaien. Zodra je het punt hebt gevonden waarnaar je ongedaan wilt maken, gebruik je de volgorde van commando's zoals hierboven uitgelegd.


1 Merk echter op dat je niet terug hoeft te zetten naar een eerdere commit als je alleen maar een fout hebt gemaakt in je commit bericht. De makkelijkste optie is om git reset (om alle veranderingen die je sindsdien gemaakt hebt ongedaan te maken) en dan git commit --amend, wat je standaard commit bericht editor zal openen, vooringevuld met het laatste commit bericht.

2 HEAD~ is hetzelfde als HEAD~1

Commentaren (17)

Bestanden toevoegen/verwijderen om de dingen te krijgen zoals u wilt:

git rm classdir
git add sourcedir

Wijzig dan de commit:

git commit --amend

De vorige, foutieve commit zal aangepast worden om de nieuwe index toestand weer te geven - met andere woorden, het zal net zijn alsof je de fout nooit gemaakt hebt.

Merk op dat je dit alleen zou moeten doen als je nog'niet gepushed hebt. Als je al gepushed hebt, dan moet je'gewoon normaal een fix committen.

Commentaren (1)
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

of

git reset --hard HEAD~1

Waarschuwing: Het bovenstaande commando zal de wijzigingen in de .java bestanden (en eventuele andere bestanden) die je wilde vastleggen permanent verwijderen.

De hard reset naar HEAD-1 zal je werkkopie terugzetten naar de staat van de commit voor je foute commit.

Commentaren (2)