Ich arbeite mit einem Repository, wo vor Wochen eine Zusammenführung durchgeführt wurde, die wir gerade entdeckt haben, benutzte das Flag --strategy=ours
(es sollte das Flag --strategy-option = our verwenden), also keine Änderungen an KOPF. Wir müssen jedoch die Änderungen anwenden. Git erkennt bereits, dass die Verzweigung zusammengeführt wird und die Festschreibung in der Geschichte der Verzweigung.
Diese Art der Zusammenführung kann nicht mit git revert -m ...
Was wäre der richtige Weg, die Zusammenführung zurückzusetzen und / oder erneut anzuwenden, um die Dateien zu ändern?
%Vor% Das Zusammenführungs-Commit (F)
wäre der Täter in diesem Szenario.
Ich habe eine Lösung für dieses Problem gefunden. Es war alles in dem Brief, den Linus schrieb, um fehlerhafte Zusammenführungen rückgängig zu machen: Wie Sie eine fehlerhafte Zusammenführung wiederherstellen können .
Der git merge --strategy=ours topic
war in unserem Fall nicht vorgesehen. Auch wenn es sich um eine fehlerhafte Zusammenführung handelt, kann sie nicht rückgängig gemacht werden. Wenn sie schon lange gedrückt wurde, hat sie den gleichen Effekt, dass sie eine Rückmeldungsübergabe durchführen kann, ohne die Zurückkehr-Festschreibung rückgängig machen zu können.
Die Lösung bestand darin, den Zweig des Themas auszuprobieren, rebase --no-ff
vom ersten Commit aus auszuführen und diesen Zweig dann wieder in den Master einzufügen.
Dies hatte den Effekt, zu ergeben:
%Vor% Um das wirklich zu verstehen, lesen Sie den letzten Teil des Briefes Um eine fehlerhafte Zusammenführung wiederherzustellen mit der Option --no-ff
rebase, um die Verzweigung neu zu erstellen.
@Highway of Life hat eine großartige Antwort. Die eine Sache ist, dass die rebasierten Commits nun wie neue, unterschiedliche Commits aussehen, was in vielen Fällen unerwünscht sein kann. Ich wollte die identischen Commits ein zweites Mal zusammenführen, aber git-merge
verhindert dies. Ich finde jedoch immer wieder, dass es immer möglich ist, git dazu zu bringen, das zu tun, was Sie wollen.
Folgen Sie den Anweisungen von Highway of Life, aber verbinden Sie sich nicht direkt mit dem Master:
%Vor%Dies führt zu:
%Vor% Jetzt ist der Baum genau so eingerichtet, wie Sie wollen - alle Dateien zeigen genau den Inhalt, den Sie wünschen. Das einzige Problem ist, dass die Eltern Ihres Merge-Commits rebasierende Kopien Ihrer ursprünglichen Commits sind, anstatt dass sie tatsächlich die ursprünglichen Commits selbst sind. Es ist einfach, dies mit git-reparent
zu beheben:
Das endet mit:
%Vor%Wichtig ist, dass sich der Inhalt von R seit dem letzten Schritt nicht geändert hat - nur die Eltern.
Schnellvorlauf-Master für den neuen Zusammenführungs-Commit:
%Vor%Schließlich können Sie mit
aufräumen %Vor%Fertig! Jetzt sieht Ihr Verlauf so aus, dass ein Zweig zweimal zusammengeführt wird:
%Vor%Eine Merge-Strategie, die besagt "Behalte das, was du hier hast, egal was du zusammen führst", kann nicht umgekehrt werden. Überprüfen Sie das erste übergeordnete Element der Zusammenführung in einem neuen Zweig, führen Sie dann die Zusammenführung erneut durch. Rebase --auf den Rest der Commits, die du oben auf deinem Original hast, verbinde dich mit diesem.
UPDATE:
In Ihrem Fall, wenn Sie sich nicht um die Vergangenheit kümmern, können Sie G-N auf E rebasen und dann D einfach auf diesen neuen Master zusammenführen. Die Rebase wird trivial sein, weil F ein --ours Merge war.
Tags und Links git git-merge git-revert