Direkt zum Inhalt

Git Revert Merge Commit: Ein Leitfaden mit Beispielen

Lerne, wie du einen Git Merge mit `git revert` sicher rückgängig machen kannst, wobei die Commit-Historie erhalten bleibt und mögliche Konflikte gelöst werden.
Aktualisierte 5. Nov. 2024  · 7 Min. Lesezeit

Wir können eine Anwendung gefährden, indem wir problematischen Code zusammenführen, sei es, weil wir versehentlich unfertige Arbeit in den Hauptzweig integrieren oder einen kritischen Fehler übersehen, der an den automatischen Tests vorbeigegangen ist.

In diesem Artikel führe ich dich durch den Prozess, wie du mit git revert einen Merge sicher rückgängig machen kannst, sodass der Commit-Verlauf intakt bleibt und die Integrität des Projekts gewahrt wird.

Werde Dateningenieur

Baue Python-Kenntnisse auf, um ein professioneller Dateningenieur zu werden.
Jetzt Kostenlos Loslegen

Wie git revert Werke

Wir können uns git revert als Gits Version eines Rückgängig-Befehls vorstellen. Der Befehl git revert löscht jedoch keine Commits und springt auch nicht zu einem früheren Zustand des Zweigs. Stattdessen wird ein neuer Commit erstellt, der die Änderungen eines bestimmten Commits rückgängig macht.

Illustration, wie git revert funktioniert

Die Syntax zum Rückgängigmachen eines Commits mit dem Hash lautet:

git revert <commit_hash>

Wir können die Commits zusammen mit ihren Hash-Kennungen mit dem Befehl git log auflisten. Die Ausgabe von git log listet die Commits vom neuesten zum ältesten Commit auf, etwa so:

Identifizierung des Commit-Hashs mit git log

Um zum Beispiel den Commit, der die Subtraktionsfunktion implementiert, rückgängig zu machen, würden wir den Befehl verwenden:

git revert 7ba24a3e62d4d37182428ccfaa070baa222b1151

Mit git revert können wir die Änderungen eines bestimmten Commits rückgängig machen, ohne die Commit-Historie zu beeinflussen.

Beachte, dass git revert nicht magisch ist und dass es je nach Commit-Historie zu einem Konflikt kommen kann, der manuell gelöst werden muss.

Vorteile von git revert Über manuelle Änderungen

Warum ist git revert nützlich, wenn wir einen Konflikt möglicherweise manuell lösen müssen? Wäre es nicht einfacher, die Änderungen einfach manuell rückgängig zu machen? Sehen wir uns die Vorteile an:

  • Behält die Historie bei: git revert erstellt einen neuen Commit, der die Änderungen eines bestimmten Commits rückgängig macht und dabei die gesamte Commit-Historie beibehält. Dies hilft dabei, eine transparente Historie der Änderungen und Stornierungen zu erhalten.
  • Atomare Umkehrung: Sie stellt sicher, dass die Umkehrungen atomar und konsistent sind. Wenn wir Änderungen manuell löschen und festschreiben, besteht die Gefahr von menschlichen Fehlern. 
  • Konfliktbewusstsein: Es stellt sicher, dass wir durch Konflikte gewarnt werden, wenn es Integrationen oder Änderungen gibt, die von der ursprünglichen Übertragung abhängen. Das mag lästig erscheinen, aber es schützt vor unbeabsichtigten Nebenwirkungen.
  • Metadata: Der neue Commit, der mit git revert erstellt wird, enthält Metadaten und eine Commit-Nachricht, die beschreibt, was rückgängig gemacht wurde, um das Verständnis für die Zukunft zu erleichtern. Ohne git revert könnte dieser Zusammenhang verloren gehen.

Zusammenführung in verschiedenen Szenarien rückgängig machen

In diesem Abschnitt lernst du, wie du eine Zusammenführung rückgängig machen kannst. Als Beispiel nehmen wir an, dass wir einen Zweig namens feature in den Zweig main zusammenführen und den Befehl aus dem Zweig main ausführen:

git merge feature

Was wir hier lernen, können wir auf zwei beliebige Zweige anwenden, indem wir die Namen entsprechend ersetzen.

Eine Zusammenführung rückgängig machen, die keine zugehörige Übertragung hat

Der Befehl git merge erstellt nicht immer einen neuen Commit. Ein Commit wird nur erstellt, wenn der Zweig main vom Zweig feature abgewichen ist. Da git revert einen Commit benötigt, um einen zu betreiben, können wir ihn in diesem Fall nicht verwenden.Erläuterung, was abweichende Git-Zweige sind

Die Zweige main und feature laufen auseinander, wenn neue Commits auf main erstellt werden, die keine Vorfahren des Zweigs feature sind. Mit anderen Worten: Neue Commits wurden auf main erstellt, nachdem feature erstellt wurde.

Wenn sich die Zweige nicht auseinanderentwickelt haben und wir den Befehl git merge feature auf dem Hauptzweig ausführen, wird Git den Schnellvorlauf zum Zusammenführen verwenden. Das bedeutet, dass sie die HEAD des main Zweigs auf die HEAD des feature Zweigs verschiebt.

Illustration dessen, was passiert, wenn wir den HEAD der <code data-mce-selected=

Wir können dies anhand des Ergebnisses von git merge beobachten:

So erkennst du, dass der Schnellvorlauf zum Zusammenführen verwendet wurde

Um eine solche Zusammenführung rückgängig zu machen, müssen wir nur die HEAD des main Zweigs dorthin zurückschieben, wo sie war. Dafür haben wir:

  1. Identifiziere die vorherige HEAD mit dem git reflog
  2. Setze die HEAD mit git reset --hard auf den vorherigen Wert zurück und ersetze durch die vorherige HEAD.

Die Ausgabe von git reflog sieht dann etwa so aus:

Die alte HEAD-Referenz finden

Wir können die vorherige HEAD identifizieren, indem wir uns die Zeile "checkout: moving from feature to main" ansehen (sie schreibt feature und main, weil das die Namen unserer Zweige sind). 

In diesem Fall ist der vorherige Kopf fe59838. Um die HEAD des Hauptzweigs wieder dorthin zu verschieben und die Zusammenführung rückgängig zu machen, verwenden wir dann den Befehl:

git reset --hard fe59838

Illustration dessen, was passiert, wenn wir den KOPF zurückschieben

Eine Zusammenführung rückgängig machen, die eine zugehörige Übertragung hat

Wenn der Zweig main und der Zweig feature voneinander abweichen, wird beim Zusammenführen der beiden Zweige ein neuer Commit erstellt, der sogenannte Merge-Commit. 

Illustration eines Merge Commits

Beim Merge Commit werden die Änderungen von einem Zweig auf einen anderen übertragen. In diesem Fall werden die Änderungen in feature auf den Zweig main angewendet.

Um die Änderungen auf dem Zweig main rückgängig zu machen, verwenden wir die git revert auf dem Merge-Commit. Dadurch wird ein neuer Commit erstellt, der die Änderungen, die mit der Zusammenführung in den Zweig main eingebracht wurden, rückgängig macht und den Zustand des Hauptzweigs vor der Zusammenführung wiederherstellt.

Als Erstes müssen wir den Hash des Merge Commits ermitteln. Wir können dies mit dem Befehl git log tun:

Identifizierung des Merge-Commit-Hashs

Da der Merge-Commit zwei Eltern hat, ist die Syntax von git revert etwas anders. Wir müssen die Option -m 1 verwenden, um anzugeben, dass wir die Änderungen relativ zum Zweig main rückgängig machen wollen:

git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d

Veranschaulichung, was passiert, wenn wir einen Git Merge Commit zurücknehmen

Konfliktlösung beim Rückgängigmachen einer Zusage

Manchmal kann es beim Rückgängigmachen eines Commits zu Konflikten kommen, insbesondere wenn der rückgängig gemachte Commit mit späteren Änderungen in der Codebasis kollidiert. In solchen Fällen:

  1. Git hält den Revert an: Wir müssen die Konflikte manuell lösen. Git wird die widersprüchlichen Dateien markieren und ein Eingreifen verlangen.
  2. Löse die Konflikte: Wir öffnen jede widersprüchliche Datei, lösen die von Git markierten Konflikte auf und speichern die Änderungen.
  3. Stelle die aufgelösten Dateien ein: git add
  4. Fahre mit der Umkehrung fort: git revert --continue

Fazit

Die Verwendung von git revert zum Rückgängigmachen von Merge-Commits stellt sicher, dass jede Änderung und Korrektur in der Commit-Historie dokumentiert wird.

Wenn wir wissen, welche Szenarien für git reset und welche für git revert geeignet sind, können wir bessere Entscheidungen treffen, vor allem wenn es um kollaborative Workflows oder lokale Änderungen geht.

Mehr zu diesem Thema findest du in den FAQs weiter unten. Wenn du mehr über Git erfahren möchtest, empfehle ich dir diese Ressourcen:

FAQs

Kann ich eine bereits veröffentlichte Zusammenführung mit git revert rückgängig machen?

Ja, das ist der Hauptanwendungsfall für git revert bei Zusammenführungen. Wenn die Änderungen lokal sind, ist git reset eine einfachere Möglichkeit, die Zusammenführung rückgängig zu machen.

Damit andere die Änderungen sehen können, müssen wir sie in das Remote-Repository pushen. Um eine bereits durchgeführte Zusammenführung rückgängig zu machen, müssen wir das also tun:

git revert -m 1 
git push origin 

Ersetze durch den Hash des Merge Commits und durch den Namen des Zweigs, in dem der Merge durchgeführt wurde.

Wird der Merge Commit nach der Verwendung von git revert gelöscht?

Nein. Der Merge-Commit bleibt in der Historie, aber seine Änderungen werden durch den neuen Commit rückgängig gemacht. Der Sinn des Rückgängigmachens einer Zusammenführung mit git revert ist es, die Commit-Historie zu erhalten.

Gibt es andere Möglichkeiten als git revert, um eine Zusammenführung rückgängig zu machen?

Eine alternative Möglichkeit, eine Zusammenführung rückgängig zu machen, ist die Verwendung von git reset. Diese Methode setzt den Zweig auf einen Zustand vor der Zusammenführung zurück. Dieser Ansatz ist aufdringlicher und kann zu Problemen führen, wenn andere Mitarbeiter ihre Arbeit bereits auf den Commits aufbauen, die wir zurücksetzen wollen. Deshalb wird sie nur empfohlen, wenn wir sicher sind, dass sie andere nicht beeinträchtigt.

git reset --hard 
git push --force

Ersetze durch den Hash des Commits, zu dem wir zurückgehen wollen.

Wann sollte ich git reset verwenden, um eine Zusammenführung rückgängig zu machen?

Ich empfehle, git reset nur zu verwenden, um eine Zusammenführung rückgängig zu machen, wenn die Zusammenführung nur lokal stattgefunden hat und noch nicht gepusht wurde.


Photo of François Aubry
Author
François Aubry
LinkedIn
Das Unterrichten war schon immer meine Leidenschaft. Schon als Schülerin habe ich eifrig nach Möglichkeiten gesucht, anderen Schülern Nachhilfe zu geben und sie zu unterstützen. Diese Leidenschaft führte dazu, dass ich einen Doktortitel anstrebte, wobei ich auch als Lehrassistentin tätig war, um meine akademischen Bemühungen zu unterstützen. In diesen Jahren fand ich im traditionellen Klassenzimmer große Erfüllung, indem ich Verbindungen förderte und das Lernen erleichterte. Mit dem Aufkommen von Online-Lernplattformen erkannte ich jedoch das transformative Potenzial der digitalen Bildung. Ich war sogar aktiv an der Entwicklung einer solchen Plattform an unserer Hochschule beteiligt. Es ist mir ein großes Anliegen, traditionelle Unterrichtsprinzipien mit innovativen digitalen Methoden zu verbinden. Meine Leidenschaft ist es, Kurse zu erstellen, die nicht nur ansprechend und informativ, sondern auch für Lernende im digitalen Zeitalter zugänglich sind.
Themen

Top Data Engineering Kurse

Lernpfad

Dateningenieur

40Std. hr
Erwerbe gefragte Fähigkeiten, um Daten effizient zu erfassen, zu bereinigen, zu verwalten und Pipelines zu planen und zu überwachen, und hebe dich damit im Bereich Data Engineering ab.
Siehe DetailsRight Arrow
Kurs Starten
Mehr anzeigenRight Arrow