
Rechnung
Ich habe ein Git-Repository, das so aussieht:
A <- B <- C <- D <- HEAD
Ich möchte, dass der Kopf des Zweigs auf A zeigt, dh ich möchte, dass B, C, D und HEAD verschwinden, und ich möchte, dass Kopf gleichbedeutend mit A ist.
Es hört sich so an, als könnte ich entweder versuchen, eine Rebase durchzuführen (gilt nicht, da ich Änderungen dazwischen geschoben habe) oder zurücksetzen. Aber wie kann ich mehrere Commits rückgängig machen? Setze ich einen nach dem anderen zurück? Ist die Reihenfolge wichtig?

Jakub Narębski
Erweitern, was ich in einem Kommentar geschrieben habe
Die allgemeine Regel ist, dass Sie den von Ihnen veröffentlichten Verlauf nicht umschreiben (ändern) sollten, weil jemand seine Arbeit darauf basieren könnte. Wenn Sie den Verlauf umschreiben (ändern), würden Sie Probleme beim Zusammenführen ihrer Änderungen und beim Aktualisieren für sie bekommen.
Die Lösung besteht also darin, eine zu erstellen neues Commitment welche macht Änderungen rückgängig die du loswerden willst. Sie können dies mit tun git zurücksetzen Befehl.
Sie haben folgende Situation:
A <-- B <-- C <-- D <-- master <-- HEAD
(Pfeile beziehen sich hier auf die Richtung des Zeigers: die „Eltern“-Referenz im Fall von Commits, die oberste Festschreibung im Fall des Zweigkopfs (Branch Ref) und der Name des Zweigs im Fall der HEAD-Referenz).
Was Sie erstellen müssen, ist Folgendes:
A <-- B <-- C <-- D <-- [(BCD)-1] <-- master <-- HEAD
wo [(BCD)^-1]
bedeutet das Commit, das Änderungen in den Commits B, C, D rückgängig macht. Mathematik sagt uns, dass (BCD)-1 = D-1 C-1 B-1sodass Sie die erforderliche Situation mit den folgenden Befehlen erhalten können:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message for all of them"
Funktioniert für alles außer Merge-Commits.
Alternative Lösung wäre zu Kasse Inhalt von Commit A und schreiben Sie diesen Zustand fest. Funktioniert auch mit Merge-Commits. Hinzugefügte Dateien werden jedoch nicht gelöscht. Wenn Sie irgendwelche lokalen Änderungen haben git stash
sie zuerst:
$ git checkout -f A -- . # checkout that revision over the top of local files
$ git commit -a
Dann hätten Sie folgende Situation:
A <-- B <-- C <-- D <-- A' <-- master <-- HEAD
Der Commit A’ hat denselben Inhalt wie Commit A, ist aber ein anderer Commit (Commit-Nachricht, Eltern, Commit-Datum).
Alternative Lösung von Jeff Ferland, modifiziert von Charles Bailey, baut auf der gleichen Idee auf, verwendet aber git zurücksetzen. Hier ist es leicht modifiziert, so FUNKTIONIERT FÜR ALLES:
$ git reset --hard A
$ git reset --soft D # (or ORIG_HEAD or @{1} [previous location of HEAD]), all of which are D
$ git commit

Tieftauchgang
Sauberer Weg, den ich nützlich fand
git revert --no-commit HEAD~3..
git commit -m "your message regarding reverting the multiple commits"
Dieser Befehl macht die letzten 3 Commits mit nur einem Commit rückgängig.
Schreibt den Verlauf auch nicht neu, erfordert also keinen Kraftstoß.
Das ..
hilft, eine Reichweite zu schaffen. Bedeutung HEAD~3..
ist das gleiche wie HEAD~3..HEAD

Sieger
Dazu müssen Sie nur die verwenden zurückkehren Befehl, der den Bereich der Commits angibt, die zurückgesetzt werden sollen.
Unter Berücksichtigung Ihres Beispiels müssten Sie Folgendes tun (vorausgesetzt, Sie befinden sich im Zweig „Master“):
git revert master~3..master
oder git revert B...D
oder git revert D C B
Dadurch wird ein neuer Commit in Ihrem Lokal mit dem umgekehrten Commit von B, C und D erstellt (was bedeutet, dass durch diese Commits eingeführte Änderungen rückgängig gemacht werden):
A <- B <- C <- D <- BCD' <- HEAD
git reset --hard a
git reset --mixed d
git commit
Das wird als Rückfall für alle auf einmal wirken. Geben Sie eine gute Commit-Nachricht.

konyak
Ähnlich wie bei Jakubs Antwort können Sie auf diese Weise einfach aufeinanderfolgende Commits auswählen, die zurückgesetzt werden sollen.
# Revert all commits from and including B to HEAD, inclusively
git revert --no-commit B^..HEAD
git commit -m 'message'

Peter Mortensen
Stellen Sie zunächst sicher, dass Ihre Arbeitskopie nicht verändert wurde.
Dann:
git diff --binary HEAD commit_sha_you_want_to_revert_to | git apply
Und dann einfach zustimmen. Vergessen Sie nicht, den Grund für die Rücknahme zu dokumentieren.

Peter Mortensen
Ich bin so frustriert, dass diese Frage nicht einfach beantwortet werden kann. Jede andere Frage bezieht sich darauf, wie man richtig zurückkehrt und die Geschichte bewahrt. Diese Frage sagt „Ich möchte, dass der Kopf des Zweigs auf A zeigt, dh ich möchte, dass B, C, D und HEAD darauf zeigen verschwinden und ich möchte, dass Kopf gleichbedeutend mit A ist.”
git checkout <branch_name>
git reset --hard <commit Hash for A>
git push -f
Ich habe viel gelernt, als ich Jakubs Post gelesen habe, aber ein Typ in der Firma (mit Zugriff auf unseren „Testing“-Zweig ohne Pull-Request) hat wie fünf schlechte Commits gepusht und versucht, einen Fehler zu beheben und zu beheben und zu beheben, den er fünf Commits gemacht hat vor. Nicht nur das, es wurden auch der ein oder andere Pull-Request akzeptiert, der nun schlecht war. Vergiss es; Ich habe den letzten guten Commit (abc1234) gefunden und einfach das grundlegende Skript ausgeführt:
git checkout testing
git reset --hard abc1234
git push -f
Ich habe den anderen fünf Leuten, die in diesem Repository arbeiten, gesagt, dass sie sich besser ihre Änderungen der letzten paar Stunden notieren und die letzten Tests löschen/neu verzweigen sollten. Das Ende der Geschichte.
10138400cookie-checkWie kann ich mehrere Git-Commits rückgängig machen?yes
Wenn Sie die Fernbedienung nur zurücksetzen möchten, können Sie sie mit allem schlagen! Aber lassen Sie uns den vierten Commit von vor verwenden:
git push -f HEAD~4:master
(vorausgesetzt, der Remote-Zweig ist der Master). Ja, Sie können jedes Commit so pushen.– u0b34a0f6ae
23. September 2009 um 1:01 Uhr
Wenn Leute gezogen haben, müssen Sie einen Commit machen, der Änderungen mit rückgängig macht
git revert
.– Jakub Narębski
23. September 2009 um 8:21 Uhr
Verwenden Sie git show HEAD~4, um sicherzustellen, dass Sie zur Fernbedienung auf die richtige Seite drücken
– Mâtt Frëëman
11. Juni 2016 um 3:08 Uhr
Mögliches Duplikat von How to Undo last Commit(s) in Git?
– Jim fiel
14. Februar 2017 um 18:53 Uhr
“Ist die Reihenfolge wichtig?” Ja, wenn die Commits dieselben Zeilen in denselben Dateien betreffen. Dann sollten Sie damit beginnen, den letzten Commit rückgängig zu machen, und sich zurückarbeiten.
– Avantursen
22. April 2017 um 11:26 Uhr