Commits rückgängig machen: reset vs. revert 🔄
Du hast also einen oder mehrere Commits gemachtgemacht, unddie merkstdu jetzt,loswerden dass etwas schief gelaufen istmöchtest – seivielleicht eswar ein Bug,Fehler dabei, oder du hast dich in eine falsche DateiRichtung oder eine Änderung, die doch nicht so gut war.entwickelt. Git bietet dirdafür zwei grundlegend verschiedene Möglichkeiten, Commits rückgängig zu machen, aber dieStrategien: richtigeReset Wahlund Revert. Welche du wählen solltest, hängt entscheidend davon ab, ob du die Commits bereits gepusht hast oder nicht.nicht.
DieDas entscheidendeGrundprinzip Frage: Lokal oder schon gepusht?verstehen
Bevor duwir irgendetwasin tust,die musstDetails gehen, hier die Kernfrage, die du dir eineimmer zentralestellen solltest:
Haben andere Menschen (oder ich selbst auf einem anderen Gerät) bereits Zugriff auf diese Commits?
Diese Frage stellen:bestimmt, welchen Weg du gehen solltest:
flowchart TD
START[A["Commit rueckgaengig machen?"] --> Q1{B{"Bereits auf GitHub gepusht?"}
Q1B -->|Nein,Nein| nur lokal| RESET[C["git reset verwenden\reset\nHistorie wird umgeschrieben"umschreiben"]
Q1B -->|Ja,Ja| bereits gepusht| REVERT[D["git revertrevert\nNeuen verwenden\nNeuerCommit Gegen-Commit"erstellen"]
RESETC --> R1[E["Sicher:Commits Du bistverschwinden\naus der Einzige,\nder diese Commits kennt"Historie"]
REVERTD --> R2[F["Sicher:Alter AndereCommit koennen\ndiebleibt,\nwird Aenderungdurch nachvollziehen"neuen rueckgaengig gemacht"]
style C fill:#90EE90,color:#000000
style D fill:#87CEEB,color:#000000
Diese Unterscheidung ist fundamental wichtig, weil:
Methode 1: git reset – die Historie umschreiben ✂️
Mit git resetverschiebstentfernst du denCommits aus deiner lokalen Historie, als hätten sie nie existiert. Das ist sauber und elegant – aber nur, solange niemand sonst diese Commits bereits hat.
Die drei Varianten von Reset
Git reset gibt es in drei „Zeiger" deines Branches auf einen früheren Commit. Die Commits,Härtegraden", die danach kamen, verschwinden aus der Historie (oder werden zumindest nicht mehr referenziert). Es gibt drei Varianten, die sich darin unterscheiden,bestimmen, was mit deinen DateiänderungenÄnderungen passiert:
Die
Soft
git reset --soft Die Commits werden entfernt, aber alle Änderungen bleiben in der Staging Area –erhalten. bereitDu fürkannst einensie neuendirekt Commit
git reset --mixedsoft HEAD~1 # Letzten Commit entfernen, Änderungen bleiben staged
--mixed (Standard) – der mittlere Weg
Die Commits werden entfernt, die Änderungen landen im Working Directory –(also nicht mehr staged, aber noch vorhanden). Du kannst entscheiden, was du kannstdavon siebehalten bearbeitenmöchtest.
git reset HEAD~1 # Letzten Commit entfernen, Änderungen im Working Directory
git reset --mixed HEAD~1 # Identisch zur Zeile darüber
Hard--hard
Die Commits werden entfernt und alle Änderungen werden unwiderruflich gelöscht. Hier ist Vorsicht geboten!
git reset --hard HEAD~1 # Letzten Commit UND alle Änderungen Was
bedeutetHEAD~1?
drei
💡HEADzeigt auf deinen aktuellen CommitHEAD~1bedeutet „ein Commit vordemHEAD"aktuellen". Für zwei Commits zurück:HEAD~2, für drei:HEAD~3,usw.würde
WannCommits welchen Modus verwenden?
Soft Reset: Du möchtest den letzten Commit „aufbrechen", um ihn anders zu strukturieren oder die Commit-Nachricht zu ändern. Die Änderungen selbst sind in Ordnung.
Mixed Reset: Du möchtestkannst denauch Commiteinen rückgängigkonkreten machenCommit-Hash undangeben: diegit Dateienreset nochmal--soft überarbeiten, bevor du sie erneut stagst und commitest.
Hard Reset: Du möchtest den Commit und alle zugehörigen Änderungen komplett loswerden. Achtung: Das ist nicht rückgängig zu machen!
Reset in PhpStorm durchführen
Öffne das Git-Log
über(untenGitim→ Show Git Logoder denGit-Tab am unteren Rand.Git-Tab)Finde den
Commit,Commit,aufzudendem duzurücksetzenzurückkehren möchtest–(also den letztenguten„guten"Commit, nicht den, den du entfernen willst.Commit)Rechtsklick auf diesen Commit
Es erscheint einIm Dialog mitwählst dendu dreizwischen Optionen:
Wähle den passenden Modus und bestätige.
Beispiel: Den letzten Commit rückgängig machen
Du💡hastTipp:geradeIneinenPhpStormCommitsiehstgemacht,duderdirekteineneineFehler enthält, aber noch nicht gepusht:ist.# Im Terminal (alternativErklärung zuPhpStorm):jedergitOption,resetwas--mixedsehrHEAD~1hilfreich
Jetzt ist der Commit weg, aber deine Änderungen sind noch da. Du kannst den Fehler beheben und einen neuen, korrekten Commit erstellen.
Methode 2: git revert – Einensicher Gegen-Commitrückgängig erstellenmachen 🛡️
Im Gegensatz zu reset ändertMit revert dieerstellst Historie nicht. Stattdessen erstellt esdu einen neuen Commit, der die Änderungen eines früheren Commits rückgängig macht. DerDie ursprünglicheursprünglichen (fehlerhafte)Commits Commit bleibtbleiben in der Historie sichtbarerhalten – aberes seinewird Auswirkungennur werdenein durch„Gegengift" denhinzugefügt.
Warum aufgehoben.Revert statt Reset bei gepushten Commits?
Wenn du Commits gepusht hast und dann mit reset deine lokale Historie umschreibst, entsteht ein Problem: Dein lokales Repository und das Remote-Repository haben dann unterschiedliche Historien. Git wird sich weigern, deinen Push zu akzeptieren, und du müsstest einen Force Push machen – was die Historie für alle anderen zerstört, die vielleicht schon mit diesen Commits arbeiten.
revert vermeidet dieses Problem elegant:
flowchart LR
A[subgraph "Nach Reset - GEFÄHRLICH"
A1["Commit A\nGrundlage"A"] --> B[A2["Commit B\nFehlerhaft"B"]
B --> C[A3["Commit C"]
A1 -.->|"reset"| A4["Commit C\nWeitere Arbeit"nverschwunden"]
Cend
subgraph "Nach Revert - SICHER"
B1["Commit A"] --> D[B2["Commit B"] --> B3["Commit C"] --> B4["Revert B\nMachtC\nmacht BC rueckgaengig"]
style B fill:#ffcccc
style D fill:#ccffccend
Warum ist das für gepushte Commits wichtig?
Wenn andere Teammitglieder (oder du selbst auf einem anderen Computer) den fehlerhaften Commit bereits heruntergeladen haben, würde ein reset zu Problemen führen:
Ein revert hingegen fügt einfach einen neuen Commit hinzu – das funktioniert sauber für alle.
Revert in PhpStorm durchführen
Öffne das Git-Log und finde den Commit, den du rückgängig machen möchtest.
Rechtsklick auf den fehlerhaften Commit und wähle Revert Commit (manchmal auch unter Git → Revert zu finden).
PhpStorm erstellt automatisch einen neuen Commit, der alle Änderungen des gewählten Commits umkehrt.
Du kannst die Commit-Nachricht anpassen – standardmäßig lautet sie etwas wie „Revert ‚Ursprüngliche Commit-Nachricht'".
Nach dem Revert kannst du ganz normal pushen, und alle anderen erhalten die Korrektur sauber über pull.
Revert im Terminal
# Den letzten Commit reverten:rückgängig machen
git revert HEAD
# Einen bestimmten Commit revertenrückgängig machen (mitper Commit-Hash):
git revert a1b2c3d4abc1234
# Mehrere Commits auf einmal revert (ältester..neuester)
git revert abc1234..def5678
GitNach dem Revert öffnet daraufhinsich einennormalerweise ein Editor für die Commit-NachrichtNachricht. desGit Revert-Commits.schlägt automatisch etwas wie „Revert ‚Feature XY hinzugefügt'" vor, was du anpassen oder übernehmen kannst.
Revert
Mehrerein CommitsPhpStorm durchführen
Mit Reset (nur lokal!)
Wenn du mehrere aufeinanderfolgende Commits zurücknehmen möchtest
# Die letzten 3 Commits rückgängig machen:
git reset --mixed HEAD~3
In PhpStorm wählst du einfach den Commit aus,
Mit Revert (auchCommit
Hier musst du jeden Commit einzeln reverten, und zwar in umgekehrter Reihenfolge (neueste zuerst):
# Mehrere Commits reverten (neueste zuerst):
git revert HEAD
git revert HEAD~1
git revert HEAD~2
# Oderautomatisch einen Bereichneuen revertenCommit, (erstelltder mehreredie Revert-Commits):Änderungen gitumkehrt
In PhpStorm führst du den Revert nacheinander für jeden Commit aus, beginnend mit dem neuesten.
Übersicht:Wann Resetwelche vs.Methode? Revert– Die Entscheidungshilfe
Methode |
Begründung |
|
|---|---|---|
reset |
||
reset |
||
reset |
||
| Commit |
revert |
revert
revert
DasDer gefährliche Terrain:Sonderfall: Force Push ⚠️
EsFalls istdu technisch möglich, auchtrotzdem nach einem PushReset diepushen Historiemöchtest zu(weil änderndu –z. mitB. einemallein sogenanntenam Projekt arbeitest und sicher bist, dass niemand sonst betroffen ist), kannst du einen Force Push: machen:
# Nach einem lokalen Reset:
git push --force
# oder etwas sicherer:
git push --force-with-lease
In DasPhpStorm solltestfindest du aberdiese nurOption tun,im wenn:Push-Dialog unter Force Push.
Du⚠️
überschreibtalleineWichtig:amForceRepositoryPusharbeitestDudie Remote-Historie unwiderruflich. Nutze das nur, wenn du absolut sicher bist, dass niemand anderesdiemit diesen Commitsbereitsarbeitet.hatInDuTeam-Projektenweißt, was du tust
⚠️Warnung:Einist Force Pushkann die Arbeit anderer unwiederbringlich zerstören, wenn sieauf dengelöschtenMain-BranchCommitsoftaufgebautsogarhaben. In den meisten Team-Situationen istrevertdie bessere Wahl.verboten.
Die
PraktischeOption Entscheidungshilfe
--force-with-lease Hierist eineetwas Zusammenfassung,sicherer: dieSie dirverweigert beiden Push, falls jemand anderes in der EntscheidungZwischenzeit hilft:gepusht hat.
flowchart TD
START["Commit rueckgaengig machen"] --> Q1{"Schon gepusht?"}
Q1 -->|Nein| Q2{"Was soll mit den\nAenderungen passieren?"}
Q2 -->|Behalten und bearbeiten| MIXED["reset --mixed"]
Q2 -->|Behalten und direkt neu committen| SOFT["reset --soft"]
Q2 -->|Komplett verwerfen| HARD["reset --hard"]
Q1 -->|Ja| Q3{"Arbeitest du alleine\nam Repository?"}
Q3 -->|Ja, ganz sicher| Q4{"Soll der Fehler\nsichtbar bleiben?"}
Q3 -->|Nein oder unsicher| REVERT1["revert verwenden"]
Q4 -->|Nein| FORCE["reset + force push\nmit Vorsicht!"]
Q4 -->|Ja oder egal| REVERT2["revert verwenden"]
ZusammenfassungPraktisches Beispiel: Der typische „Oh nein"-Moment
Szenario: Du hast gerade einen Commit gemacht und gepusht, der versehentlich Debug-Code enthält.
-
NochPrüfen,nichtwasgepusht?passiert ist:→Schau
Nutzeim Git-Log, welcher Commit das Problem verursacht hat (notiere dir den Hash, z. B.git reseta1b2c3d– du hast volle Kontrolle über deine lokale Historie und kannst sie nach Belieben ändern.). -
BereitsRevertgepusht?durchführen:→ Nutzegit revert a1b2c3d–Oder
esinistPhpStorm:sicher,RechtsklicktransparentaufunddenfunktioniertCommitfür→alle,Revertdie das Repository nutzen.Commit -
Den Revert-Commit pushen:
git push
Fertig! Die Debug-Änderungen sind rückgängig gemacht, und die Historie zeigt transparent, was passiert ist.
Zusammenfassung 📋
reset schreibt die Historie um – ideal für lokale Commits, die noch niemand gesehen hat
revert erstellt einen neuen „Rückgängig-Commit" – sicher für bereits gepushte Commits
Faustregel: Sobald ein Commit gepusht wurde, nutze revert
Force Push Das Wichtigste ist: Git verliert selten wirklich Daten. Selbst nach einem harten Reset kannst du mit git reflog oft noch auf die „verlorenen" Commits zugreifen – aber das ist ein fortgeschrittenes Thema für einen anderen Tag. 😊