Jemand akzeptierte eine Pull-Anfrage, die er nicht haben sollte. Jetzt haben wir eine Menge fehlerhaften Codes zusammengeführt. Wie können Sie eine Pull-Anfrage rückgängig machen? Ich wollte gerade die Änderungen am Commit kurz vor dem Zusammenführen zurücksetzen, aber ich bemerkte, dass es in einer Reihe von Commits zusammengeführt wurde. Jetzt gibt es all diese Commits von dieser Person aus Tagen vor der Fusion. Wie machst du das rückgängig?
git
github
merge
pull-request
Wille
quelle
quelle
Antworten:
Es gibt eine bessere Antwort auf dieses Problem, obwohl ich dies nur Schritt für Schritt aufschlüsseln könnte.
Sie müssen die neuesten Upstream-Änderungen wie folgt abrufen und auschecken, z. B.:
Wenn Sie sich das Festschreibungsprotokoll ansehen, sollten Sie etwas Ähnliches finden:
Jetzt möchten Sie die gesamte Pull-Anforderung mit der Möglichkeit zurücksetzen, sie später wieder rückgängig zu machen. Dazu müssen Sie die ID des Zusammenführungs-Commits verwenden .
Im obigen Beispiel ist das Zusammenführungs-Commit das oberste, in dem "Zusammengeführte Pull-Anforderung Nr. 123 ..." steht .
Wenn Sie dies tun, um die beiden Änderungen zurückzusetzen ( "Balken hinzufügen " und "foo hinzufügen" ), erhalten Sie in einem Commit die gesamte Pull-Anforderung, die Sie später rückgängig machen können, und halten den Änderungsverlauf sauber:
quelle
git checkout upstream/master -b revert/john/foo_and_bar
? was macht es genauSehen Sie sich Ihr Commit-Diagramm an (mit gitk oder einem ähnlichen Programm). Sie sehen Commits aus der Pull-Anforderung, und Sie sehen Ihre eigenen Commits und ein Merge-Commit (wenn es sich nicht um eine Schnellvorlauf-Merge handelt). Sie müssen nur die letzten Ihrer eigenen Commits vor dem Zusammenführen finden und den Zweig auf dieses Commit zurücksetzen.
(Wenn Sie das Reflog des Zweigs haben, sollte es noch einfacher sein, das Commit vor dem Zusammenführen zu finden.)
(Nach weiteren Informationen in den Kommentaren bearbeiten :)
Okay, schauen wir uns die Grafik an:
Ich gehe davon aus, dass das letzte (ganz rechts) Commit Ihre falsche Zusammenführung durch Pull-Anforderung war , bei der die hier gezeigte blaue Linie zusammengeführt wurde. Ihr letztes gutes Commit wäre das vorhergehende auf der schwarzen Linie, hier rot markiert:
Auf dieses Commit zurücksetzen, und es sollte Ihnen gut gehen.
Dies bedeutet, dass Sie dies in Ihrer lokalen Arbeitskopie tun müssen (nachdem Sie sichergestellt haben, dass Sie keine nicht festgeschriebenen Inhalte mehr haben, z. B. von git stash):
Bestätigen Sie jetzt, dass Sie sich wirklich auf dem Commit befinden, das ich dort markiert habe, und Sie werden keines der gezogenen Dinge in seiner Herkunft sehen.
(Wenn Ihre Github-Fernbedienung benannt ist
origin
, ändern Sie den Namen.)Jetzt sollte auch auf Github alles richtig aussehen. Die Commits befinden sich weiterhin in Ihrem Repository, sind jedoch für keine Zweigstelle erreichbar und sollten dort keinen Schaden anrichten. (Und sie werden natürlich immer noch im Repository von RogerPaladin sein.)
(Es gibt möglicherweise eine Github-spezifische Nur-Web-Methode, um dasselbe zu tun, aber ich bin mit Github und seinem Pull-Request-Verwaltungssystem nicht allzu vertraut.)
Beachten Sie, dass jemand, der Ihren Master möglicherweise bereits mit dem falschen Commit gezogen hat, das gleiche Problem hat wie Sie derzeit und nicht wirklich einen Beitrag leisten kann. vor dem Zurücksetzen auf Ihre neue Master-Version.
Wenn dies wahrscheinlich passiert ist oder Sie einfach nur Probleme vermeiden möchten, verwenden Sie
git revert
stattdessen den Befehlgit reset
, um die Änderungen mit einem neuen Commit zurückzusetzen, anstatt auf ein älteres zurückzusetzen. (Einige Leute denken, Sie sollten niemals mit veröffentlichten Zweigen zurücksetzen.) Weitere Antworten auf diese Frage finden Sie hier.Für die Zukunft:
Wenn Sie nur einige der Commits von RogerPaladins Zweig möchten, sollten Sie
cherry-pick
stattdessen anstelle von verwendenmerge
. Oder kommunizieren Sie mit RogerPaladin, um sie in einen separaten Zweig zu verschieben und eine neue Pull-Anfrage zu senden.quelle
reset --hard
und ein Force-Push) sehr schlechte Praxis). Die Antwort von @errordeveloper unten zeigt einen Weg, dies zu tun, ohne dass die Geschichte neu geschrieben oderWenn der Zug das letzte war, was er dann tat
quelle
git reset --hard HEAD~1
ichgit push origin -f
das Remote-Repository aktualisiert. Aber seien Sie vorsichtig, seien Sie vorsichtig, bevor Sie dies tun.Ab dem 24. Juni 2014 können Sie versuchen, eine PR einfach abzubrechen (siehe " Zurücksetzen einer Pull-Anfrage ") mit:
Einführung in die Schaltfläche "Zurücksetzen"
Es bleibt jedoch zu prüfen, ob diese
-m
Rücknahme verwendet wird oder nicht (auch zum Zurücksetzen von Zusammenführungen).Aber Adil H Raza fügt in den Kommentaren (Dezember 2019) hinzu:
Warnung : Korayem weist in den Kommentaren darauf hin, dass:
Korayem verweist uns auf " Github: Änderungen, die nach revert (
git cherry-pick
,git rebase
) ignoriert werden " für mehr.quelle
Um eine Github-Pull-Anforderung mit Commits rückgängig zu machen, die Sie nicht löschen möchten, müssen Sie Folgendes ausführen:
git reset --hard --merge <commit hash>
Der Commit-Hash ist der Commit VOR dem Zusammenführen der Pull-Anforderung. Dadurch werden alle Commits aus der Pull-Anforderung entfernt, ohne dass Commits im Verlauf beeinflusst werden.
Ein guter Weg, dies zu finden, besteht darin, zur jetzt geschlossenen Pull-Anfrage zu gehen und dieses Feld zu finden:
Anforderungsbild ziehen
Nachdem Sie das ausgeführt haben
git reset
, führen Sie Folgendes aus :git push origin --force <branch name>
Dies sollte die Verzweigung vor der Pull-Anforderung zurücksetzen, OHNE dass sich Commits in der Verzweigung auf den Commit-Verlauf zwischen Commits aus der Pull-Anforderung auswirken.
BEARBEITEN:
Wenn Sie in der Pull-Anforderung auf die Schaltfläche "Zurücksetzen" klicken, wird ein zusätzliches Commit für den Zweig erstellt. Es wird NICHT aufgehoben oder getrennt. Dies bedeutet, dass Sie keine neue Pull-Anforderung öffnen können, um den gesamten Code erneut hinzuzufügen, wenn Sie auf die Schaltfläche "Zurücksetzen" klicken.
quelle
Ich benutze diesen Ort die ganze Zeit, danke.
Ich suchte nach einer Möglichkeit, eine Pull-Anfrage rückgängig zu machen, und kam hierher.
Ich war gerade dabei
git reset --hard
, "vor langer Zeit" einen schnellen Vorlauf zurück zu machen, wo ich war, bevor ich die Pull-Anfrage machte.Neben dem Blick hierher fragte ich meinen Kollegen auch, was er tun würde, und er hatte eine typisch gute Antwort: Verwenden Sie die Beispielausgabe in der ersten Antwort oben:
Wie bei den meisten Dingen in Git machen Sie es wahrscheinlich falsch, wenn Sie es auf eine Weise tun, die nicht einfach ist.
quelle