Ich habe über diesen Link eine gute Erklärung für das Zurücksetzen der Zusammenführung gefunden und die unten stehende Erklärung kopiert. Dies ist hilfreich, falls der folgende Link nicht funktioniert.
So setzen Sie eine fehlerhafte Zusammenführung zurück
rückgängig macht Alan (alan@clueserver.org) sagte:
Ich habe eine Hauptniederlassung. Wir haben einen Zweig davon, an dem einige Entwickler arbeiten. Sie behaupten, es sei fertig. Wir führen es in der Hauptniederlassung zusammen. Es bricht etwas, also kehren wir die Zusammenführung zurück. Sie nehmen Änderungen am Code vor. Sie bringen es zu einem Punkt, an dem sie sagen, dass es in Ordnung ist und wir wieder zusammenführen. Bei der Prüfung stellen wir fest, dass sich Codeänderungen, die vor dem Zurücksetzen vorgenommen wurden, nicht im Hauptzweig befinden, sondern Codeänderungen nach dem Zurücksetzen im Hauptzweig. und bat um Hilfe, um sich von dieser Situation zu erholen.
Die Geschichte unmittelbar nach der "Rückkehr der Fusion" würde folgendermaßen aussehen:
---o---o---o---M---x---x---W
/
---A---B
Wenn sich A und B auf der Seitenentwicklung befinden, die nicht so gut war, ist M die Zusammenführung, die diese vorzeitigen Änderungen in die Hauptlinie bringt, x sind Änderungen, die nicht mit dem zusammenhängen, was der Seitenzweig auf der Hauptlinie getan und bereits vorgenommen hat, und W ist die " Zurücksetzen der Zusammenführung M "(sieht W M nicht verkehrt herum aus?). IOW, "diff W ^ .. W" ist ähnlich wie "diff -RM ^ .. M".
Ein solches "Zurücksetzen" einer Zusammenführung kann erfolgen mit:
$ git revert -m 1 M
Nachdem die Entwickler des Seitenzweigs ihre Fehler behoben haben, sieht der Verlauf möglicherweise folgendermaßen aus:
---o---o---o---M---x---x---W---x
/
---A---B-------------------C---D
wo C und D reparieren sollen, was in A und B kaputt war, und Sie möglicherweise bereits einige andere Änderungen an der Hauptlinie nach W haben.
Wenn Sie den aktualisierten Seitenzweig zusammenführen (mit D an der Spitze), wird keine der in A oder B vorgenommenen Änderungen im Ergebnis angezeigt, da sie von W zurückgesetzt wurden. Das hat Alan gesehen.
Linus erklärt die Situation:
Das Zurücksetzen eines regulären Commits macht das, was dieses Commit bewirkt hat, effektiv rückgängig und ist ziemlich einfach. Durch das Zurücksetzen eines Zusammenführungs-Commits werden jedoch auch die Daten rückgängig gemacht, die durch das Commit geändert wurden. Die Auswirkungen auf den Verlauf werden , dass die Zusammenführung hatte. Die Zusammenführung wird also weiterhin bestehen, und es wird weiterhin als Zusammenschluss der beiden Zweige angesehen, und bei zukünftigen Zusammenführungen wird diese Zusammenführung als der letzte gemeinsame Zustand angesehen - und die Rücknahme, die die eingeführte Zusammenführung rückgängig gemacht hat, hat keinerlei Auswirkungen darauf. Ein "Zurücksetzen" macht also die Datenänderungen rückgängig, aber es ist sehr viel nicht jedoch absolut nicht rückgängig gemacht, da die Auswirkungen eines Commits auf den Repository-Verlauf nicht rückgängig gemacht werden. Wenn Sie also "Zurücksetzen" als "Rückgängig" betrachten, werden Sie diesen Teil der Rückgängigmachung immer verpassen. Ja, die Daten werden rückgängig gemacht, aber nein, der Verlauf wird nicht rückgängig gemacht. In einer solchen Situation möchten Sie zuerst die vorherige Wiederherstellung zurücksetzen, wodurch der Verlauf folgendermaßen aussehen würde:
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
wobei Y die Rückkehr von W ist. Eine solche "Rückkehr der Rückkehr" kann durchgeführt werden mit:
$ git revert W
Dieser Verlauf würde (ohne Berücksichtigung möglicher Konflikte zwischen dem, was W und W..Y geändert haben) bedeuten, dass W oder Y überhaupt nicht im Verlauf enthalten sind:
---o---o---o---M---x---x-------x----
/
---A---B-------------------C---D
und das erneute Zusammenführen des Seitenzweigs führt nicht zu Konflikten, die sich aus einem früheren Zurücksetzen und Zurücksetzen des Zurücksetzens ergeben.
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
Natürlich können die in C und D vorgenommenen Änderungen immer noch mit dem in Konflikt stehen, was von einem der x vorgenommen wurde, aber das ist nur ein normaler Zusammenführungskonflikt.