it-swarm.com.de

Rückgängig machen einer Zusammenführung durch Pull-Anfrage?

Jemand akzeptierte eine Pull-Anfrage, die sie nicht haben sollten. Jetzt haben wir eine Menge gebrochenen Codes eingemischt. Wie können Sie eine Pull-Anfrage rückgängig machen? Ich wollte gerade die Änderungen am Commit kurz vor dem Zusammenführen wieder rückgängig machen, aber ich habe bemerkt, dass es in einer Reihe von Commits verschmolz. Nun gibt es alle diese Verpflichtungen von dieser Person aus den Tagen vor der Verschmelzung. Wie machst du das rückgängig?

121
Will

Es gibt eine bessere Antwort auf dieses Problem, obwohl ich es einfach schrittweise abbauen könnte. 

Sie müssen die neuesten Upstream-Änderungen abrufen und auschecken, z.

git fetch upstream
git checkout upstream/master -b revert/john/foo_and_bar

Wenn Sie sich das Commit-Protokoll ansehen, sollten Sie etwas Ähnliches finden:

commit b76a5f1f5d3b323679e466a1a1d5f93c8828b269
Merge: 9271e6e a507888
Author: Tim Tom <[email protected]>
Date:   Mon Apr 29 06:12:38 2013 -0700

    Merge pull request #123 from john/foo_and_bar

    Add foo and bar

commit a507888e9fcc9e08b658c0b25414d1aeb1eef45e
Author: John Doe <[email protected]>
Date:   Mon Apr 29 12:13:29 2013 +0000

    Add bar

commit 470ee0f407198057d5cb1d6427bb8371eab6157e
Author: John Doe <[email protected]>
Date:   Mon Apr 29 10:29:10 2013 +0000

    Add foo

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 merge-Commit verwenden.

Im obigen Beispiel ist das merge-Commit das oberste, wo es "Merged pull request # 123 ..." sagt.

Führen Sie dies aus, um die beiden Änderungen ("Add bar" und "Add foo") rückgängig zu machen, und am Ende werden Sie mit einem Commit die gesamte Pull-Anforderung rückgängig machen, die Sie später rückgängig machen und den Verlauf beibehalten können von Änderungen sauber:

git revert -m 1 b76a5f1f5d3b323679e466a1a1d5f93c8828b269
109
errordeveloper

Schau dir deine Commit-Grafik an (mit gitk oder einem ähnlichen Programm). In der Pull-Anforderung werden Commits angezeigt, und Sie werden Ihre eigenen Commits und ein Zusammenführungs-Commit sehen (wenn es sich nicht um eine Schnellvorlauf-Zusammenführung handelt). Sie müssen nur das letzte Ihrer Commits vor der Zusammenführung finden und den Zweig auf dieses Commit zurücksetzen.

(Wenn Sie den Refflog des Zweigs haben, sollte es noch einfacher sein, den Commit vor der Zusammenführung zu finden.)


(Bearbeiten Sie nach weiteren Informationen in Kommentaren :)

Okay, schauen wir uns die Grafik an:

screenshot 1

Ich gehe davon aus, dass das letzte (ganz rechts liegende) Commit Ihr falsches mischen durch Pull-Request war, wodurch die blaue Linie hier zusammengeführt wurde .. _ Ihr letztes gutes Commit wäre das vorherige auf der schwarzen Linie, hier rot markiert:

enter image description here

Setzen Sie das Commit zurück, und Sie sollten in Ordnung sein.

Dies bedeutet, dass Sie dies in Ihrer lokalen Arbeitskopie tun müssen (nachdem Sie sichergestellt haben, dass Sie keine weiteren nicht festgeschriebenen Daten haben, z. B. von Git Stash):

git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk 

Bestätigen Sie nun, dass Sie wirklich an dem Commit sind, das ich dort markiert habe, und Sie werden nichts von den abgerissenen Dingen in seiner Herkunft sehen.

git Push -f Origin master

(Wenn Ihre Github-Fernbedienung Origin heißt - andernfalls ändern Sie den Namen).

Jetzt sollte auch auf github alles richtig aussehen. Die Commits befinden sich immer noch in Ihrem Repository, sind jedoch für keine Zweigstelle erreichbar und sollten daher dort nicht beschädigt werden. (Und sie werden natürlich immer noch in RogerPaladins Repository sein.)

(Möglicherweise gibt es eine Github-spezifische Web-Methode, um dasselbe zu tun, aber ich bin mit Github und seinem Pull-Request-Verwaltungssystem nicht allzu vertraut.)

Beachten Sie, dass, wenn bereits jemand anderes Ihren Master mit dem falschen Commit gezogen hat, er das gleiche Problem wie Sie derzeit hat und nicht wirklich einen Beitrag leisten kann. vor dem Zurücksetzen auf Ihre neue Master-Version.

Wenn dies wahrscheinlich der Fall ist oder Sie einfach Probleme vermeiden möchten, verwenden Sie den Befehl git revert anstelle von git reset, um die Änderungen mit einem neuen Commit zurückzusetzen und nicht auf ein älteres zurückzusetzen. (Einige Leute meinen, Sie sollten niemals mit veröffentlichten Verzweigungen zurücksetzen.) Weitere Antworten auf diese Frage finden Sie in der Anleitung.

Für die Zukunft:

Wenn Sie nur einige der Commits von RogerPaladins Zweig verwenden möchten, sollten Sie cherry-pick anstelle von merge verwenden. Oder kommunizieren Sie mit RogerPaladin, um sie in einen separaten Zweig zu verschieben und eine neue Pull-Anforderung zu senden.

86
Paŭlo Ebermann

Wenn der Zug das letzte war, was er damals tat

git reset --hard HEAD~1
31
samthebest

Ab dem 24. Juni 2014 können Sie einen PR einfach abbrechen (siehe " Zurücksetzen einer Pull-Anfrage ") mit:

Einführung des Zurücksetzen-Buttons

sie können eine Pull-Anfrage auf GitHub leicht rückgängig machen, indem Sie auf Wiederherstellen klicken:

https://camo.githubusercontent.com/0d3350caf2bb1cba53123ffeafc00ca702b1b164/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6c696e6b2e706e67

Sie werden aufgefordert, eine neue Pull-Anforderung mit den zurückgegebenen Änderungen zu erstellen:

https://camo.githubusercontent.com/973efae3cc2764fc1353885a6a45b9a518d9b78b/68747470733a2f2f6769746875622d696d616765732e73332e616d617a6f6e6177732e636f6d2f68656c702f70756c6c5f72657175657374732f7265766572742d70756c6c2d726571756573742d6e65772d70722e706e67

Es muss jedoch noch getestet werden, ob diese Umkehrung -m verwendet (oder auch für die Umstellung von Zusammenführungen).

20
VonC

Um eine github-Pull-Anfrage mit Commits, die Sie nicht löschen möchten, rückgängig zu machen, müssen Sie Folgendes ausführen:

git reset --hard --merge <commit hash>

der Commit-Hash ist der Commit-PRIOR, um die Pull-Anforderung zusammenzuführen. Dadurch werden alle Commits aus der Pull-Anforderung entfernt, ohne die Commits innerhalb der Historie zu beeinflussen.

Eine gute Möglichkeit, dies zu finden, besteht darin, zur jetzt geschlossenen Pull-Anforderung zu gehen und dieses Feld zu finden:

Pull Request ImagePull Request Image

Nachdem Sie git reset ausgeführt haben, führen Sie a aus:

git Push Origin --force <branch name>

Dies sollte den Zweig zurückstellen, bevor die Pull-Anforderung WITHOUT Auswirkungen auf Commits in dem Zweig hat, die in der Commit-Historie zwischen Commits aus der Pull-Anforderung gespeichert sind.

EDIT:

Wenn Sie in der Pull-Anfrage auf die Schaltfläche zum Zurücksetzen klicken, wird ein zusätzlicher Commit für die Verzweigung erstellt. Es ist nicht unverbindlich oder entmischen. Wenn Sie also auf die Schaltfläche "Zurücksetzen" klicken, können Sie keine neue Pull-Anforderung öffnen, um den gesamten Code erneut hinzuzufügen.

5
FluffySamurai

Ich benutze diesen Ort die ganze Zeit, danke.

Ich suchte, wie ich eine Pull-Anfrage rückgängig machen kann und bin hierher gekommen.

Ich war kurz davor git reset --hard vor "vor langer Zeit" unddo einen schnellen Vorlauf zurück zu dem Punkt, an dem ich vor dem Pull-Request war.

Neben dem Blick hierher habe ich auch meinen Kollegen gefragt, was er tun würde, und er hatte eine typisch gute Antwort: anhand der Beispielausgabe in. Die erste Antwort oben:

git reset --hard 9271e6e

Wie bei den meisten Dingen in Git, wenn Sie es auf eine Art und Weise tun, ist das nicht einfach, Sie machen es wahrscheinlich falsch.

0
Mike Marshall