Re-doing eine zurück merge in Git
-
21-08-2019 - |
Frage
Ich habe in ein bisschen ein Problem laufe hier: Ich hatte ein Problem spezifischen Zweig 28s
in Git, dass ich in dem allgemeinen develop
Zweig verschmolzen. Stellt sich heraus, ich hatte es zu schnell getan, so habe ich git-revert die Zusammenführung rückgängig zu machen. Nun aber ist die Zeit gekommen 28s
in develop
zu verschmelzen, aber git-merge-Befehl sieht die ursprüngliche merge, und kündigt glücklich, dass alles gut ist und Filialen sind bereits verschmolzen. Was mache ich jetzt? Erstellen Sie eine 'Revert "Revert "28s -> entwickeln""' begehen? Scheine nicht ein guter Weg, es zu tun, aber ich kann keine andere im Moment vorstellen kann.
Was die Baumstruktur wie folgt aussieht:
Lösung
Sie müssen „das zufließen“. Hängt davon ab, wie haben Sie zurückkommen, dass es nicht so einfach sein, wie es sich anhört. Schauen Sie sich die Thema .
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
ermöglichen:
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
Aber ist das alles? Sicher, es tut. Sie können eine Zusammenführung und aus einem zufällt rein technischer Sicht, es git tat sehr natürlich und hatte keine wirkliche Schwierigkeiten.
Es hält es nur einen Wechsel von „Zustand vor merge“, um „Zustand nach merge“, und das war es.
Nichts kompliziert, nichts seltsam, nichts wirklich gefährlich. Git wird es tun, ohne auch nur darüber nachzudenken.So von einem technischen Winkel, es ist nichts falsch mit einer Zusammenführung zurückkehrt, aber aus einem Workflow Winkel ist es etwas, das Sie in der Regel versuchen sollten vermeiden .
Wenn möglich, beispielsweise, wenn Sie ein Problem finden, das hätte verschmolzen in den Hauptbaum, anstatt die Zusammenführung zurückkehren, versuchen Sie wirklich schwer :
- bisect das Problem in der Filiale ab verschmolzen, und es einfach zu beheben,
- oder versuchen, die einzelnen verpflichten zurückzukehren, die sie verursacht hat.
Ja, es ist komplizierter, und nein, es ist nicht immer (manchmal zur Arbeit gehen die Antwort lautet: „oops, ich sollte wirklich nicht zusammengeschlossen haben, weil es nicht war noch nicht fertig, und ich brauche wirklich alle des Merge ") rückgängig zu machen. Sie also dann sollte wirklich die Zusammenführung zurückkehren, aber wenn man die Zusammenführung erneut tun möchten, können Sie Jetzt müssen es tun, indem Sie die revert zurückkehrt.
Andere Tipps
Nehmen wir an, Sie solche Geschichte
---o---o---o---M---W---x-------x-------*
/
---A---B
Wenn A, B gescheitert Commits und W - ist zufällt von M
Also, bevor ich zur Festsetzung beginnen gefunden Probleme Ich cherry-pick von W zu meinem Zweig begehen
git cherry-pick -x W
Dann zufällt ich W auf meinem Zweig commit
git revert W
Nachdem ich Fixierung fortsetzen kann.
Die letzte Geschichte könnte wie folgt aussehen:
---o---o---o---M---W---x-------x-------*
/ /
---A---B---W---W`----------C---D
Wenn ich einen PR senden wird es zeigt deutlich, dass PR rückgängig zu machen ist revert und fügt einige neue Commits.
den revert zurückkehren möchte, ohne den Workflow zu viel vermasseln:
- Erstellen Sie eine lokale Kopie von Müll entwickeln
- Revert die revert auf die lokale Kopie Commit entwickeln
- Merge, die in der Feature-Zweig zu kopieren, und drücken Sie die Feature-Zweig zu Ihrem git-Server.
Ihr Zweig soll nun in der Lage sein, normal werden zusammengeführt, wenn Sie bereit sind. Der einzige Nachteil ist, dass Sie ein paar zusätzlichen merge a haben werden / Revert Commits in Ihrer Geschichte.
Um einen Revert in GIT zurückkehren:
git revert <commit-hash-of-previous-revert>
Statt git-revert
verwenden Sie diesen Befehl in der devel
Zweig verwendet haben, könnten auf wegzuwerfen (rückgängig machen) die falsche merge commit (statt Zurücksetzen es nur).
git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE
Dies wird auch den Inhalt des Arbeitsverzeichnisses entsprechend anpassen. Seien Sie vorsichtig, :
- Speichern Sie die Änderungen in der Branche entwickeln (da die falsche merge), weil sie
Auch wird durch die
git-reset
gelöscht werden. Alle verpflichtet nach dem von dir angegebenen als dasgit reset
Argument weg sein! - Auch nicht dies tun, wenn Sie Ihre Änderungen wurden bereits von anderen Repositories gezogen da der Reset wird die Geschichte neu zu schreiben.
Ich empfehle die git-reset
Mann-Seite sorgfältig zu studieren, bevor dies zu versuchen.
Nun, nach dem Reset können Sie erneut anwenden, um die Änderungen in devel
und dann tun
git checkout devel
git merge 28s
Das wird einen echten Druck aus 28s
in devel
wie auch die ersten sein (das ist jetzt
gelöscht, aus der Geschichte des git).
Ich habe gerade diesen Beitrag, wenn vor dem gleichen Problem. Ich finde oben wayyy zu beängstigend Reset Harten usw. tun ich etwas zu löschen am Ende werde ich möchte nicht, und werden nicht in der Lage sein, es wieder zu bekommen.
Stattdessen schaute ich aus der befehle ich den Zweig wollte zum Beispiel gehen zurück git checkout 123466t7632723
. Dann konvertiert einen Zweig git checkout my-new-branch
. Ich löschte dann den Zweig ich nicht mehr wollte. Natürlich wird dies nur funktionieren, wenn Sie in der Lage sind, um die Verzweigung Sie messed wegzuwerfen.
Ich würde vorschlagen, Sie unten Schritte zu folgen ein revert zurückkehren, sagen SHA1.
git checkout develop #go to develop branch
git pull #get the latest from remote/develop branch
git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
git revert SHA1
git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote
PR für die Branche users/yourname/revertOfSHA1
erstellen
- Erstellen neuer Zweig an begehen vor dem ursprünglichen merge - nennen es es entwickeln-base '
- führen interaktive rebase von ‚entwickeln‘ auf `entwickeln Basis" (auch wenn es bereits oben ist). Während der interaktiven Unterfütterungsmaterial, werden Sie die Möglichkeit haben, zu entfernen sowohl die Zusammenführung verpflichten, und der Commit dass die Zusammenführung umgekehrt, das heißt entfernen Sie beide Ereignisse aus git Geschichte
An diesem Punkt werden Sie ein sauberes haben ‚entwickeln‘ Zweig, zu dem Sie Ihre Funktion Brechen fusionieren können, wie Sie regelmäßig tun.