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:
- Bestimmen wir den vorherigen
HEAD
mithilfe des Befehlsgit reflog
- Setzen Sie den
HEAD
auf den vorherigen zurück, indem Siegit reset --hard <previous_head>
verwenden, wobei Sie<previous_head>
durch den vorherigenHEAD
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:
- Git wird die Rücksetzung unterbrechen: Wir müssen manuell Konflikte lösen. Git markiert die kollidierenden Dateien und verlangt eine Intervention.
- Lösen der Konflikte: Wir öffnen jede kollidierende Datei, lösen die von Git markierten Konflikte und speichern die Änderungen.
- Die gelösten Dateien in den Index aufnehmen:
git add <datei-pfad>
- 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: