Git Revert Merge Commit: Eine Anleitung mit Beispielen

Wir können eine Anwendung durch das Zusammenführen problematischen Codes kompromittieren, sei es durch versehentliches Integrieren unvollendeter Arbeiten in den Hauptzweig oder durch Übersehen eines kritischen Fehlers, der an automatischen Tests vorbeigeschlüpft ist.

In diesem Artikel werde ich Sie durch den Prozess der sicheren Rückgängigmachung eines Merges mit git revert führen, thereby ensuring that the commit history remains intact and the integrity of the project is preserved.

Wie git revert funktioniert

Wir können git revert als Git-Version eines Undo-Befehls betrachten. Der Befehl git revert löscht jedoch keine Commits oder springt in einen vorherigen Zustand des Zweigs. Stattdessen erstellt er einen neuen Commit, der die Änderungen aus einem bestimmten Commit rückgängig macht.

Die Syntax, um einen Commit mit dem Hash <commit_hash> rückgängig zu machen, ist:

git revert <commit_hash>

Wir können die Commits zusammen mit ihren Hash-Identifikatoren mithilfe des Befehls git log auflisten. Die Ausgabe von git log listet die Commits von neuestem bis zum ältesten Commit, wie folgt:

Um beispielsweise den Commit rückgängig zu machen, der die Subtraktionsfunktion implementiert, 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.

Vorteile von git revert gegenüber manuellen Änderungen

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

  • Erhält die Historie: git revert erstellt einen neuen Commit, der die Änderungen eines bestimmten Commits rückgängig macht, während die gesamte Commit-Historie erhalten bleibt. Dies hilft dabei, eine transparente Historie von Änderungen und Rückgängen zu führen.
  • Atomare Rückgängigmachung: Es stellt sicher, dass die Rückgängigmachungen atomar und konsistent sind. Beim manuellen Löschen und Committen von Änderungen gibt es ein Risiko für menschliche Fehler.
  • Bewusstsein für Konflikte: Es stellt sicher, dass wir durch Konflikte alarmiert werden, wenn es Integrations- oder Änderungen gibt, die vom ursprünglichen Commit abhängen. Dies mag unbequem erscheinen, aber es schützt vor unerwünschten Nebeneffekten.
  • Metadaten: Der neue Commit, der durch git revert erstellt wird, enthält Metadaten und eine Commit-Nachricht, die kontextuell beschreibt, was rückgängig gemacht wurde, was bei zukünftiger Understanding hilft. Ohne git revert könnteDieser Kontext verloren gehen.

Rückgängigmachen eines Merges in verschiedenen Szenarien

In diesem Abschnitt lernen wir, wie man einen Merge rückgängig macht. Zur Verdeutlichung unterstellen wir, dass wir eine名为 feature änderung in den main Branch fusionieren und den Befehl von dem main Branch ausführen:

git merge feature

Was wir hier lernen, kann auf任意两个分支 durch Ersetzen der Namen entsprechenden angewendet werden.

Reverting a merge that has no associated commit

Der Befehl git merge erstellt nicht immer einen neuen Commit. Ein Commit wird nur erstellt, wenn der Zweig main sich vom Zweig feature abgegrenzt hat. Da git revert einen Commit zum Arbeiten benötigt, können wir es in diesem Fall nicht verwenden.

Die Zweige main und feature grenzen sich ab, wenn neue Commits auf dem main-Zweig erstellt werden, die keine Vorfahren des feature-Zweiges sind. Mit anderen Worten, nach der Erstellung von feature wurden neue Commits auf main erstellt.

Falls die Zweige sich nicht abgegrenzt haben, wird Git den Befehl git merge feature auf dem Hauptzweig mit einem Fast-Forward-Merge ausführen. Das bedeutet, dass es den HEAD-Pfeil des main-Zweigs zur HEAD-Position des feature-Zweigs verschiebt.

Wir können feststellen, dass dies passiert ist, indem wir das Ergebnis von git merge betrachten:

Um solchen einen Merge rückgängig zu machen, müssen wir nur den HEAD-Pfeil des main-Zweigs an die vorherige Position zurückverschieben. Dafür:

  1. Bestimmen wir den vorherigen HEAD mithilfe des Befehls git reflog
  2. Setzen Sie den HEAD auf den vorherigen zurück, indem Sie git reset --hard <previous_head> verwenden, wobei Sie <previous_head> durch den vorherigen HEAD ersetzen.

Die Ausgabe von git reflog sieht大概 so aus:

Wir können den vorherigen HEAD durchsuchen, indem wir die Zeile betrachten, die „checkout: moving from feature to main“ sagt (es schreibt feature und main, weil das die Namen unserer Äste sind). 

In diesem Fall ist der vorherige Kopf fe59838. Um den HEAD der Hauptäste zurück zu bewegen und den Merge rückgängig zu machen, verwenden wir dann den Befehl:

git reset --hard fe59838

Den Merge rückgängig machen, der einen zugehörigen Commit hat

Wenn die main– und die feature-Äste auseinander gedriftet sind, dann wird bei der Zusammenführung von zwei Ästen ein neuer Commit erstellt, der Merge Commit genannt wird. 

Der Merge Commit überträgt die Änderungen von einem Ast auf einen anderen. In diesem Fall werden die Änderungen in feature auf den main-Ast angewendet.

Um die Änderungen auf dem main-Ast rückgängig zu machen, verwenden wir den git revert auf dem Merge Commit. Dies erstellt einen neuen Commit, der die Änderungen rückgängig macht, die durch den Merge in den main-Ast gebracht wurden, und stellt den Zustand des Hauptastes effektiv auf den Zustand vor dem Merge zurück.

Zuerst müssen wir den Hash des Merge-Commits identifizieren. Dies können wir mit dem Befehl git log tun:

Da der Merge-Commit zwei Elternteile hat, ist die Syntax von git revert leicht unterschiedlich. Wir müssen die Option -m 1 verwenden, um anzugeben, dass wir die Änderungen relativ zur main-Branch zurücksetzen möchten:

git revert -m 1 b8dab2c8611e324ed0d273133987415350e6d10d

Konfliktlösung bei der Rücksetzung eines Commits

Manchmal können Konflikte bei der Rücksetzung eines Commits auftreten, insbesondere wenn der rückzusetzende Commit mit späteren Änderungen im Codebasis kollidiert. In如此 Fällen:

  1. Git wird die Rücksetzung unterbrechen: Wir müssen manuell Konflikte lösen. Git markiert die kollidierenden Dateien und verlangt eine Intervention.
  2. Lösen der Konflikte: Wir öffnen jede kollidierende Datei, lösen die von Git markierten Konflikte und speichern die Änderungen.
  3. Die gelösten Dateien in den Index aufnehmen: git add <datei-pfad>
  4. Die Rücksetzung fortsetzen: git revert --continue

Schlussfolgerung

Die Verwendung von git revert, um Merge-Commits rückgängig zu machen, stellt sicher, dass jede Änderung und Korrektur innerhalb der Commit-Historie dokumentiert ist.

Zusätzlich ermöglicht das Verständnis der geeigneten Szenarien für die Anwendung von git reset versus git revert uns bessere Entscheidungen zu treffen, insbesondere bei Berücksichtigung von kooperativen Arbeitsabläufen oder lokalen Änderungen.

Mehr zu diesem Thema findest du im FAQ-Bereich unten. Wenn du mehr über Git lernen möchtest, empfehle ich diese Ressourcen:

Source:
https://www.datacamp.com/tutorial/git-revert-merge