it-swarm.com.de

Wie kann ein Merge-Commit zurückgesetzt werden, der bereits an die Remote-Zweigstelle übertragen wurde?

git revert <commit_hash> alleine funktioniert nicht. -m muss angegeben werden, und ich bin ziemlich verwirrt.

Hat das schon mal jemand erlebt?

654
Yaz

Die -m-Option gibt die parent number an. Dies liegt daran, dass ein Merge-Commit mehr als ein übergeordnetes Element hat und Git nicht automatisch erkennt, welches übergeordnetes Element die Hauptlinie war und welches übergeordnetes Element der Zweig war, den Sie entfernen möchten.

Wenn Sie ein Zusammenführungs-Commit in der Ausgabe von git log anzeigen, werden die übergeordneten Elemente in der Zeile aufgeführt, die mit Merge beginnt:

commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James <[email protected]>
Date:   Wed Aug 17 22:49:41 2011 +0100

Merge branch 'gh-pages'

Conflicts:
    README

In dieser Situation erhalten Sie mit git revert 8f937c6 -m 1 die Struktur, wie sie in 8989ee0 war, und git revert -m 2 setzt die Struktur wieder in 7c6b236.

Um die übergeordneten IDs besser zu verstehen, können Sie Folgendes ausführen:

git log 8989ee0 

und 

git log 7c6b236
798
Ben James

Hier ist ein vollständiges Beispiel in der Hoffnung, dass es jemandem hilft:

git revert -m 1 <commit-hash> 
git commit -m "Reverting the last commit which messed the repo."
git Push -u Origin master

Wo <commit-hash> der Commit-Hash der Zusammenführung ist, den Sie zurücksetzen möchten, und wie in der Erklärung von diese Antwort , -m 1 angegeben, bedeutet, dass Sie vor der Zusammenführung zum Baum des ersten übergeordneten Elements zurückkehren möchten .

Die git commit ...-Zeile übernimmt im Wesentlichen Ihre Änderungen, während die dritte Zeile Ihre Änderungen öffentlich macht, indem Sie sie an den entfernten Zweig weiterleiten.

279
Saheed

Ben hat Ihnen gesagt, wie Sie ein Merge-Commit wieder rückgängig machen können, aber es ist sehr wichtig Sie wissen, dass Sie dies tun "erklärt, dass Sie niemals die Baumänderungen, die durch das Merge eingebracht werden, wollen. Dies führt dazu, dass spätere Merges nur dazu führen werden Baumänderungen, die durch Commits, die keine Vorfahren der zuvor rückgängig gemachten Zusammenführung sind, eingeführt werden. Dies ist möglicherweise nicht das, was Sie wollen. " (git-merge manpage) .

Eine Artikel-/Mailinglisten-Nachricht , die auf der Manpage verlinkt ist, enthält Details zu den Mechanismen und Überlegungen. Stellen Sie nur sicher, dass Sie verstehen, dass Sie die Verzweigung später nicht wieder zusammenführen können, wenn Sie das Merge-Commit rückgängig machen, und die gleichen Änderungen erwarten.

135
Ryan Stewart

Sie können die folgenden Schritte ausführen, um die falschen Festschreibungen zurückzusetzen oder Ihren Remote-Zweig auf den korrekten HEAD/Status zurückzusetzen.

  1. checkout der remote branch to local repo.
    git checkout development
  2. kopieren Sie den Commit-Hash (d. h. die ID des Commits unmittelbar vor dem falschen Commit) aus dem Git-Protokoll git log -n5

    ausgabe:

    7cd42475d6f95f5896b6f02e902efab0b70e8038 "Zweig 'wrong-commit' in 'development' zusammenführen"
    Commit f9a734f8f44b0b37ccea769b9a2fd774c0f0c012 "Dies ist ein falsches Commit"
    Commit 3779ab50e72908da92d2cfcd72256d7a09f446ba "das ist das richtige Commit"

  3. setzen Sie den Zweig auf den im vorherigen Schritt kopierten Festschreibungs-Hash zurück
    git reset <commit-hash> (i.e. 3779ab50e72908da92d2cfcd72256d7a09f446ba)

  4. führen Sie den git status aus, um alle Änderungen anzuzeigen, die Teil des falschen Commits waren.
  5. führen Sie einfach git reset --hard aus, um alle diese Änderungen rückgängig zu machen.
  6. drücken Sie Ihren lokalen Zweig auf Remote und stellen Sie fest, dass Ihr Festschreibungsverlauf so sauber ist, wie er war, bevor er verschmutzt wurde.
    git Push -f Origin development
67
ssasi
git revert -m 1 <merge-commit>
33
Neeraj Kumar

Um das Protokoll sauber zu halten, da nichts passiert ist (mit einigen Nachteilen bei diesem Ansatz (aufgrund von Push -f)):

git checkout <branch>
git reset --hard <commit-hash-before-merge>
git Push -f Origin HEAD:<remote-branch>

'commit-hash-before-merge' kommt nach dem Zusammenführen aus dem Protokoll (git-Protokoll).

16
nvd

Manchmal ist der effektivste Weg für ein Rollback das Zurücksetzen und Ersetzen.

git log

Verwenden Sie den 2nd-Commit-Hash (den vollständigen Hash, den Sie wiederherstellen möchten, bevor der Fehler aufgeführt wird), und verzweigen Sie dann von dort neu.

git checkout -b newbranch <HASH>

Dann löschen Sie den alten Zweig, kopieren Sie die neue Niederlassung an ihre Stelle und starten Sie von dort aus neu.

git branch -D oldbranch
git checkout -b oldbranch newbranch

Wenn es übertragen wurde, löschen Sie den alten Zweig aus allen Repositorys. Schieben Sie den erneuten Zweig in den zentralen Bereich und ziehen Sie ihn auf alle zurück.

14
ppostma1

Wenn Sie ein merge Commit zurücksetzen möchten, müssen Sie Folgendes tun.

  1. Überprüfen Sie zunächst den git log, um die ID Ihres Merge-Commits zu ermitteln. Sie finden auch mehrere übergeordnete IDs, die mit der Zusammenführung verknüpft sind (siehe Abbildung unten).

enter image description here

Notieren Sie sich die Merge-Commit-ID, die in Gelb angezeigt wird. Die übergeordneten IDs sind diejenigen, die in der nächsten Zeile als Merge: parent1 parent2 geschrieben sind. Jetzt...

Kurzgeschichte:

  1. Wechseln Sie zu dem Zweig, in dem die Zusammenführung vorgenommen wurde. Dann machen Sie einfach den git revert <merge commit id> -m 1, der eine vi Konsole zur Eingabe der Commit-Nachricht öffnet. Schreiben, speichern, beenden, fertig!

Lange Geschichte:

  1. Wechseln Sie zu dem Zweig, in dem die Zusammenführung vorgenommen wurde. In meinem Fall ist es der Zweig test und ich versuche, den Zweig feature/analytics-v3 daraus zu entfernen.

  2. git revert ist der Befehl, mit dem ein Commit zurückgesetzt wird. Aber es gibt einen bösen Trick, wenn ein merge Commit zurückgesetzt wird. Sie müssen das -m -Flag eingeben, da es sonst fehlschlägt. Von nun an müssen Sie entscheiden, ob Sie Ihren Zweig zurücksetzen möchten und ihn genau so aussehen lassen, wie er auf parent1 oder parent2 war:

git revert <merge commit id> -m 1 (kehrt zu parent2 zurück)

git revert <merge commit id> -m 2 (kehrt zu parent1 zurück)

Sie können diese Eltern protokollieren, um herauszufinden, welchen Weg Sie einschlagen möchten, und das ist die Wurzel aller Verwirrung.

2
saran3h

Die richtig markierte Antwort funktionierte für mich, aber ich musste einige Zeit aufwenden, um zu bestimmen, was los ist. Also beschloss ich, eine Antwort mit einfachen, einfachen Schritten für Fälle wie meinen hinzuzufügen.

Nehmen wir an, wir haben die Zweige A und B. Sie haben den Zweig A mit dem Zweig B zusammengeführt und den Zweig B zu sich selbst verschoben. Jetzt ist die Zusammenführung Teil davon. Sie möchten jedoch zum letzten Festschreiben zurückkehren vor dem Zusammenführen .. Was machst du?

  1. Gehe in deinen Git-Stammordner (normalerweise der Projektordner) und benutze git log
  2. Sie sehen den Verlauf der letzten Festschreibungen. Die Festschreibungen haben Festschreibungs-/Autoren-/Datumseigenschaften, während die Zusammenführungen auch eine Zusammenführungseigenschaft haben. Sie sehen sie also folgendermaßen:

    commit: <commitHash> Merge: <parentHashA> <parentHashB> Author: <author> Date: <date>

  3. Verwenden git log <parentHashA> und git log <parentHashB> - Sie sehen die Commit-Historien dieser übergeordneten Zweige - die ersten Commits in der Liste sind die neuesten

  4. Nehmen Sie die <commitHash> des gewünschten Commits, gehe in deinen Git-Root-Ordner und benutze git checkout -b <newBranchName> <commitHash> - Damit wird ein neuer Zweig ab dem letzten Commit erstellt, den Sie vor dem Zusammenführen ausgewählt haben. Voila, fertig!

Ich habe festgestellt, dass das Erstellen eines umgekehrten Patches zwischen zwei bekannten Endpunkten und das Anwenden dieses Patches funktionieren würde. Dies setzt voraus, dass Sie Snapshots (Tags) von Ihrem Master-Zweig oder sogar von einem Backup Ihres Master-Zweigs erstellt haben, beispielsweise master_bk_01012017.

Angenommen, der Code-Zweig, den Sie mit master zusammengefügt haben, war mycodebranch.

  1. Checkout-Master.
  2. Erstellen Sie einen vollständigen binären Reverse-Patch zwischen Master und Ihrem Backup .git diff --binary master..master_bk_01012017 > ~/myrevert.patch
  3. Überprüfen Sie Ihren Patch git apply --check myrevert.patch
  4. Anwenden des Patches mit Abmeldung git am --signoff < myrevert.patch
  5. Wenn Sie diesen Code erneut eingeben müssen, nachdem er behoben wurde, müssen Sie den zurückgesetzten Master verzweigen und den Fix-Zweig git branch mycodebranch_fixgit checkout mycodebranch_fix auschecken.
  6. Hier müssen Sie die Taste SHA für das Zurücksetzen finden und das Zurücksetzen wiederherstellen git revert [SHA]
  7. Jetzt können Sie Ihren mycodebranch_fix verwenden, um die Probleme zu beheben, festzuschreiben und erneut mit dem Master zusammenzuführen, sobald Sie dies getan haben.
1
alexplain

Alle Antworten deckten bereits die meisten Dinge ab, aber ich werde meine 5 Cent addieren. Kurz gesagt, ein Merge-Commit ist ganz einfach:

git revert -m 1 <commit-hash>

Wenn Sie die Erlaubnis haben, können Sie es direkt auf den "Master" -Zweig pushen, andernfalls einfach auf Ihren "Revert" -Zweig pushen und eine Pull-Anfrage erstellen.

Weitere nützliche Informationen zu diesem Thema finden Sie hier: https://itcodehub.blogspot.com/2019/06/how-to-revert-merge-in-git.html

0
xproph

git doc über git revert -m liefert einen Link, der dies genau erklärt: https://github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt

0
Junyong