git revert <commit_hash>
alleine funktioniert nicht. -m
muss angegeben werden, und ich bin ziemlich verwirrt.
Hat das schon mal jemand erlebt?
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
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.
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.
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.
git checkout development
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"
setzen Sie den Zweig auf den im vorherigen Schritt kopierten Festschreibungs-Hash zurückgit reset <commit-hash> (i.e. 3779ab50e72908da92d2cfcd72256d7a09f446ba)
git status
aus, um alle Änderungen anzuzeigen, die Teil des falschen Commits waren.git reset --hard
aus, um alle diese Änderungen rückgängig zu machen.git Push -f Origin development
git revert -m 1 <merge-commit>
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).
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.
Wenn Sie ein merge
Commit zurücksetzen möchten, müssen Sie Folgendes tun.
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).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:
git revert <merge commit id> -m 1
, der eine vi
Konsole zur Eingabe der Commit-Nachricht öffnet. Schreiben, speichern, beenden, fertig!Lange Geschichte:
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.
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.
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?
git log
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>
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
<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.
git diff --binary master..master_bk_01012017 > ~/myrevert.patch
git apply --check myrevert.patch
git am --signoff < myrevert.patch
git branch mycodebranch_fix
git checkout mycodebranch_fix
auschecken.git revert [SHA]
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
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