/ / Gibt es eine Möglichkeit, die durch eine Verschmelzung in der Vergangenheit vorgenommenen Änderungen anzuwenden? - git, github, merge, git-merge

Gibt es eine Möglichkeit, die Änderungen aus einer Zusammenführung in der Vergangenheit anzuwenden? - git, github, merge, git-merge

Ich musste eine Verschmelzung in den Master-Zweig zurückführenweil der Zweig einige unerwünschte Änderungen enthielt. Die Branche enthielt jedoch auch viele Änderungen, die ich überarbeiten muss. Gibt es eine Möglichkeit, alle Änderungen, die durch diese Verschmelzung zum Master hinzugefügt wurden, in meinem aktuellen Zweig anzuwenden und zu entscheiden, welche dieser Änderungen ich in Szene setzen möchte und welche nicht.

Danke im Voraus.

Antworten:

0 für die Antwort № 1

Wie immer können Sie entweder die Zusammenführung auswählen,oder die Wiederherstellung der Zusammenführung rückgängig machen. Wenn Sie die Zusammenführung auswählen möchten, müssen Sie eine übergeordnete Nummer angeben. Auf dieselbe Weise mussten Sie eine übergeordnete Nummer angeben, um die Zusammenführung rückgängig zu machen.

Wenn Sie nicht wollen, dass das Ergebnis festgeschrieben wird, auch wenn der Befehl "Cherry Pick" oder "Revert" von sich aus erfolgreich ist, können Sie dem Befehl mitteilen, den Commit-Schritt nicht auszuführen git reset --soft HEAD^ oder git reset --soft HEAD~1 Den aktuellen Zweig um einen Schritt zurückschieben - fast genauso wie das Entfernen des Commits selbst -, ohne den Inhalt des Index und des Arbeitsbaums zu ändern.

(Ich sage "fast gleich", da das Festschreiben weiterhin besteht und standardmäßig mindestens 30 Tage lang geschützt ist, da seine Hash-ID mindestens im Eintrag "reflog" gespeichert ist)

Alternativen

Dies ist jedoch möglicherweise nicht die klügste Gesamtstrategie.

Angenommen, Sie haben so etwas:

...--o--o-----*---------M--F--W--G--H   <-- mainline
             /
A--B--C--D--E   <-- feature

woher M ist die schlechte Verschmelzung und A--B--C--D--E ist die ursprüngliche Commit-Kette, mit der versucht wird, ein Feature zu erzeugen. Verpflichten W ist die Wiederholung der Verschmelzung M (w ist eine Art auf dem Kopf stehendes m) und es kann auch verschiedene andere Commits gegeben haben, beispielsweise F durch H.

Was begehen M ist / tut - abgesehen davon, dass es natürlich eine Verschmelzung ist -, dass es Änderungen an seiner vornimmt zuerst Elternteil (*, oben) basierend auf dem Unterschied zwischen dem übergeordneten Basiselement von A bis zum letzten feature verpflichten E. Es führt also eine ganze Reihe von Änderungen ein, und Sie haben jetzt festgestellt, dass die großen Änderungen fehlerhaft sind. Commit W führt eine weitere große Menge von Änderungen ein: die genau rückgängig machen M.

Wenn Sie jetzt zurückkehren Woder Kirschpickel MSie erhalten eine weitere große Anzahl von Änderungen. Wenn Sie dies tun, ohne zu verpflichten noch Sie können diese Änderungen selektiv anwenden oder rückgängig machen, indem Sie sich mit Ihrem Arbeitsbaum beschäftigen (vielleicht mit Ihrem Index oder ganz manuell) und dann git adddie überarbeiteten großen Änderungen und das Festschreiben. Aber das gibt Ihnen einen weiteren großen Teil der Änderungen in Ihrem neuen Commit I:

...--o--o-----*---------M--F--W--G--H--I   <-- mainline
             /
A--B--C--D--E   <-- feature

Das letzte Sobald Sie einen großen Klumpen an Änderungen hinzugefügt haben, war es soBuggy. Vielleicht wäre es eine gute Idee, die Änderungen schrittweise schrittweise so einzuführen, dass jeder einzeln getestet werden kann, ähnlich wie der A-B-C-D-E Sequenz.

In der Tat ist diese Sequenz wahrscheinlich ein guter Anfang. Angenommen, du hättest es tun sollen Kopieren jedes Commit in der A-B-C-D-E Sequenz zu a Neu (aber korrigiert) Commit: A", gefolgt von B", gefolgt von C", und so weiter. Ob A selbst ist richtig - wenn alle Probleme in, sagen wir, B und später - kopiere es trotzdem:

                                      A"  <-- feature.1
/
...--o--o-----*---------M--F--W--G--H   <-- mainline
             /
A--B--C--D--E   <-- feature

Wiederholen Sie für B durch E:

                                      A"-B"-C"-D"-E"  <-- feature.1
/
...--o--o-----*---------M--F--W--G--H   <-- mainline
             /
A--B--C--D--E   <-- feature

und jetzt haben Sie einen korrekten (und getesteten) überarbeiteten Funktionszweig, den Sie wie üblich zusammenführen können:

                                      A"-B"-C"-D"-E"  <-- feature.1
/             
...--o--o-----*---------M--F--W--G--H---------------M"   <-- mainline
             /
A--B--C--D--E

An dieser Stelle ist nichts Besonderes erforderlich feature.1 Niederlassung ist vollständig zweischneidbar, um alle zu lokalisieren Neu Fehler in der neu hinzugefügten Funktion, die sich nur auf den Namen und die Absicht bezieht (jedoch keine festgeschriebenen Hashes) der ursprünglich hinzugefügten fehlerhaften Funktion.

Nun, da Sie davon wissen, haben Sie es wahrscheinlich schon benutzt git bisect zu finden welche von A-B-C-D-E eingeführt, die bugs, wenn man also en masse kopieren könnte A durch E produzieren A" durch E" (und noch nicht zusammenführen), dann könntest du laufen git rebase -i und rücksichtsvoll einsetzen edits, um sie zu reparieren, oder verwenden Sie dazu die automatischen Squash- / Auto-Fixup-Funktionen von Git.

Alles, was Sie brauchen, ist die "en masse copy" -Operation ... die sich herausstellt, ist bereits eingebaut in git rebase, als die --no-ff Option, wie beschrieben Hier.