Lernpfad
Git Revert Merge Commit: Ein Leitfaden mit Beispielen
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
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.
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:
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.
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.
Wir können dies anhand des Ergebnisses von git merge
beobachten:
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:
- Identifiziere die vorherige
HEAD
mit demgit reflog
- Setze die
HEAD
mitgit reset --hard
auf den vorherigen Wert zurück und ersetzedurch die vorherige
HEAD
.
Die Ausgabe von git reflog
sieht dann etwa so aus:
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
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.
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:
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
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:
- 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.
- Löse die Konflikte: Wir öffnen jede widersprüchliche Datei, lösen die von Git markierten Konflikte auf und speichern die Änderungen.
- Stelle die aufgelösten Dateien ein:
git add
- 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.
Top Data Engineering Kurse
Lernpfad
Associate Data Engineer
Lernpfad