Seite auswählen
Der Unterschied zwischen Reset und Reverse ist einfach darzustellen. Nachfolgend findet sich die Ausgangssituation: vier Commits, der HEAD steht bei Nummer vier.
Möchte ich nun einen vorangegangenen Commit rückgängig machen, kann ich das auf mehrere Arten tun. Gegenüberstellen werden wir hier nur Revert und Reset. Eine weitere Alternative wäre ein Rebase, mit dem wir uns aber in einem gesonderten Artikel beschäftigen.

Revert

Der Revert ist simpel: die Änderungen des Commits, der rückgängig gemacht werden soll, werden genau entgegengesetzt ausgeführt. Diese Änderungen spiegeln sich in einem neuen Commit. Für den Revert-Befehl muss lediglich der Hash des Commits, der reverted werden soll, angegeben werden.

git revert #3

Dieser reiht sich in der History ein, was zu folgendem Ergebnis führt:

Reset

Beim Reset werden Änderungen im eigentlichen Sinn nicht rückgängig gemacht, sondern der Head auf einen bestimmten Commit gesetzt.

Für den Reset stehen dabei verschiedene Modi zur Verfügung: soft, mixed und hard.

Soft macht die Änderungen rückgängig, behält sie nach dem reset aber als staged changes. Ähnlich wie mixed, nur dass die Änderungen unstaged sind. Bei hard werden die Änderungen komplett verworfen; es ist also Vorsicht geboten.

Die Varianten soft und mixed verhalten sich wie oben beschrieben. Am Beispiel von hard, soll kurz dargestellt werden, was beim Reset passiert.

Reset-Modi

–soft – The staged snapshot and working directory are not altered in any way.

–mixed – The staged snapshot is updated to match the specified commit, but the working directory is not affected. This is the default option.

–hard – The staged snapshot and the working directory are both updated to match the specified commit.

git reset --hard HEAD~2

Die Commits, die ‚auf dem Weg‘ liegen, gehen dabei nicht verloren, aber tauchen im Anschluss an den Reset nicht mehr in der History auf:

Zumindest für die nächsten 30 Tage (GIT Default) sind die Commits noch gespeichert. Im ausgecheckten Branch ist es aber so, als hätte es sie nicht gegeben.

Kurz zusammengefasst

Der Revert ist die ’saubere‘ Methode einen Commit rückgängig zu machen, wohingegen der Reset Commits verschwinden lässt und sich somit für das Zurücksetzen eines Branches oder mit den Modi soft und mixed für das Bereinigen der History eignet. Das gilt jedoch – wie immer – nur für lokale, nicht gepushte Branches.