Was ist der Unterschied zwischen `git reset` und `git revert`?

Git ist eines der beliebtesten Versionskontrollsysteme für Softwareentwickler und Teams. Es bietet eine Vielzahl von Befehlen, die Entwicklern helfen, den Verlauf ihrer Projekte zu verwalten. Zwei dieser wichtigen Befehle sind git reset und git revert. Obwohl beide Befehle dazu verwendet werden, Änderungen in einem Git-Repository rückgängig zu machen, gibt es wesentliche Unterschiede in ihrer Funktionsweise und ihrem Anwendungsbereich. In diesem Artikel erklären wir die Unterschiede zwischen git reset und git revert und wann jeder Befehl am besten eingesetzt wird.

Was ist `git reset`?

Der git reset Befehl wird verwendet, um Änderungen in einem Git-Repository rückgängig zu machen, indem er den aktuellen Head-Zweig (Branch) auf einen bestimmten Zustand zurücksetzt. Dies hat Auswirkungen auf den Index und/oder das Arbeitsverzeichnis, je nachdem, welche Option verwendet wird. Der Befehl git reset kann auf drei verschiedene Arten verwendet werden: --soft, --mixed und --hard.

1. `git reset –soft`

Mit dem Befehl git reset --soft wird der Head-Zweig auf den angegebenen Commit zurückgesetzt, aber alle Änderungen im Arbeitsverzeichnis und im Index bleiben erhalten. Dies bedeutet, dass alle Änderungen im Staging-Bereich (Index) erhalten bleiben und noch einmal überprüft oder angepasst werden können. Es eignet sich gut, wenn Sie einen Commit entfernen möchten, aber die Änderungen weiterhin im Staging-Bereich haben möchten.

2. `git reset –mixed`

Der Befehl git reset --mixed ist die Standardoption von git reset. Er setzt den Head-Zweig auf den angegebenen Commit zurück und entfernt die Änderungen aus dem Staging-Bereich. Es hat jedoch keine Auswirkungen auf das Arbeitsverzeichnis, sodass alle ungestagten Änderungen weiterhin vorhanden sind. Dieser Befehl ist nützlich, wenn Sie einen Commit rückgängig machen möchten, aber die Änderungen nicht verlieren wollen und diese später erneut überprüfen können.

3. `git reset –hard`

Der Befehl git reset --hard setzt sowohl den Head-Zweig als auch das Arbeitsverzeichnis und den Staging-Bereich auf den angegebenen Commit zurück. Alle Änderungen, die im Arbeitsverzeichnis oder im Staging-Bereich gemacht wurden, gehen verloren. Dieser Befehl ist sehr mächtig und sollte mit Vorsicht verwendet werden, da er nicht rückgängig gemacht werden kann, ohne dass ein Backup vorhanden ist. git reset --hard wird häufig verwendet, wenn Entwickler unerwünschte Änderungen vollständig entfernen möchten.

Was ist `git revert`?

Im Gegensatz zu git reset erstellt der Befehl git revert einen neuen Commit, der die Änderungen eines vorherigen Commits rückgängig macht. Dies ist besonders nützlich, wenn Sie Änderungen in einem öffentlichen Repository rückgängig machen möchten, ohne den Verlauf zu verändern. Der Befehl fügt einen neuen Commit hinzu, der die Effekte eines anderen Commits rückgängig macht, und lässt dabei die Historie des Repositories unverändert.

Beispiel für `git revert`

Angenommen, Sie möchten einen Fehler in einem früheren Commit rückgängig machen. Statt den Verlauf zu ändern, können Sie den Befehl git revert verwenden:

git revert 

Dies erstellt einen neuen Commit, der den Commit mit der angegebenen ID rückgängig macht. Im Gegensatz zu git reset wird die Historie des Projekts nicht umgeschrieben, was bedeutet, dass git revert sicher in einem öffentlichen Repository verwendet werden kann, ohne die Integrität der Versionsgeschichte zu beeinträchtigen.

Wichtige Unterschiede zwischen `git reset` und `git revert`

Obwohl sowohl git reset als auch git revert dazu verwendet werden, Änderungen rückgängig zu machen, unterscheiden sie sich in mehreren entscheidenden Punkten:

  • Auswirkung auf die Historie: git reset ändert den Verlauf des Projekts und kann den Git-Log löschen oder verändern. git revert erstellt hingegen einen neuen Commit und lässt die Historie des Repositories unverändert.
  • Verwendung in öffentlichen Repositories: git reset sollte mit Vorsicht in öffentlichen Repositories verwendet werden, da es den Verlauf umschreibt. git revert ist sicherer, da es einen neuen Commit erstellt und den Verlauf nicht verändert.
  • Wiederherstellung von Änderungen: git reset entfernt Änderungen aus dem Staging-Bereich und/oder dem Arbeitsverzeichnis. git revert macht einen Commit rückgängig, ohne Änderungen aus dem Arbeitsverzeichnis zu entfernen.

Wann sollte man `git reset` verwenden?

Der Befehl git reset eignet sich besonders gut für folgende Szenarien:

  • Wenn Sie Ihre lokalen Änderungen vollständig verwerfen möchten, z. B. bei einem Fehler in einem Commit oder einer Reihe von Commits.
  • Wenn Sie einen Commit aus Ihrer lokalen Historie entfernen möchten, aber keine Auswirkungen auf das öffentliche Repository haben.
  • Wenn Sie ein sauberes Arbeitsverzeichnis haben möchten, indem alle nicht gestagten Änderungen entfernt werden.

Wann sollte man `git revert` verwenden?

Der Befehl git revert ist ideal in den folgenden Szenarien:

  • Wenn Sie Änderungen aus einem Commit rückgängig machen möchten, ohne den Verlauf zu ändern, insbesondere in einem öffentlichen Repository.
  • Wenn Sie einen Fehler in einem Commit beheben möchten, aber den bestehenden Verlauf nicht beschädigen wollen.
  • Wenn Sie eine klare, nachvollziehbare Geschichte von Änderungen und Rückgängen im Repository behalten möchten.

Fazit

Zusammenfassend lässt sich sagen, dass sowohl git reset als auch git revert nützliche Befehle in Git sind, die jedoch unterschiedliche Zwecke erfüllen. git reset ist ideal, wenn Sie die lokale Historie umschreiben und Änderungen rückgängig machen möchten, während git revert eine sicherere Methode ist, um Fehler in einem öffentlichen Repository zu korrigieren, ohne die Historie zu beeinträchtigen. Es ist wichtig, den richtigen Befehl für Ihre spezifischen Anforderungen auszuwählen, um unerwünschte Änderungen zu vermeiden und die Integrität Ihrer Projektgeschichte zu gewährleisten.

Durch das Verständnis der Unterschiede zwischen git reset und git revert können Entwickler fundierte Entscheidungen treffen, wie sie mit Versionskontrolle in Git umgehen und ihre Repositories effektiv verwalten können.