Dies ist eine Erweiterung einer der Lösungen, die in Jakubs Antwort enthalten sind
Ich war mit einer Situation konfrontiert, in der die Commits, die ich zurücksetzen musste, ziemlich komplex waren, wobei mehrere der Commits Merge-Commits waren, und ich musste vermeiden, die Geschichte neu zu schreiben. Ich war nicht in der Lage, eine Reihe von git revert
Befehle, weil ich irgendwann auf Konflikte zwischen den hinzugefügten Rückgängigmachungsänderungen gestoßen bin. Am Ende habe ich die folgenden Schritte verwendet.
Checken Sie zunächst den Inhalt der Ziel-Commit aus, während Sie HEAD an der Spitze des Zweigs belassen:
$ git checkout -f <target-commit> -- .
(Die -- stellt sicher <target-commit>
wird als Commit und nicht als Datei interpretiert; das . bezieht sich auf das aktuelle Verzeichnis).
Bestimmen Sie dann, welche Dateien in den zurückgenommenen Commits hinzugefügt wurden und daher gelöscht werden müssen:
$ git diff --name-status --cached <target-commit>
Die hinzugefügten Dateien sollten mit einem "A" am Anfang der Zeile angezeigt werden, und es sollte keine weiteren Unterschiede geben. Wenn nun Dateien entfernt werden müssen, markieren Sie diese Dateien zum Entfernen:
$ git rm <filespec>[ <filespec> ...]
Übertragen Sie schließlich die Umkehrung:
$ git commit -m 'revert to <target-commit>'
Falls gewünscht, stellen Sie sicher, dass der gewünschte Zustand wiederhergestellt ist:
$git diff <target-commit> <current-commit>
Es sollte keine Unterschiede geben.