Erweitern, was ich in einem Kommentar geschrieben habe
Die allgemeine Regel lautet, dass Sie den von Ihnen veröffentlichten Verlauf nicht neu schreiben (ändern) sollten, da möglicherweise jemand seine Arbeit darauf basiert hat. Wenn Sie den Verlauf neu schreiben (ändern), treten Probleme beim Zusammenführen der Änderungen und beim Aktualisieren auf.
Die Lösung besteht also darin, ein neues Commit zu erstellen , das Änderungen zurücksetzt , die Sie entfernen möchten. Sie können dies mit dem Befehl git revert tun .
Sie haben folgende Situation:
A <- B <- C <- D <- Master <- HEAD
(Die Pfeile beziehen sich hier auf die Richtung des Zeigers: die "übergeordnete" Referenz bei Commits, die oberste Commit bei Verzweigungskopf (Verzweigungsreferenz) und der Name der Verzweigung bei HEAD-Referenz).
Was Sie erstellen müssen, ist Folgendes:
A <- B <- C <- D <- [(BCD) ^ - 1] <- Master <- HEAD
wobei "[(BCD) ^ - 1]" das Commit bedeutet, das Änderungen in den Commits B, C, D zurücksetzt. Die Mathematik sagt uns, dass (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ -1, also Sie können die erforderliche Situation mit den folgenden Befehlen erhalten:
$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"
Mögliche Lösung wäre, Kasse Inhalt der commit A, und verpflichten diesen Zustand:
$ git checkout -f A -- .
$ git commit -a
Dann hätten Sie folgende Situation:
A <- B <- C <- D <- A '<- master <- HEAD
Das Festschreiben A 'hat den gleichen Inhalt wie Festschreiben A, ist jedoch ein anderes Festschreiben (Festschreibungsnachricht, Eltern, Festschreibungsdatum).
Die von Charles Bailey modifizierte Lösung von Jeff Ferland baut auf derselben Idee auf, verwendet jedoch Git-Reset :
$ git reset --hard A
$ git reset --soft @{1} # (or ORIG_HEAD), which is D
$ git commit
git push -f HEAD~4:master
(vorausgesetzt, der Remote-Zweig ist Master). Ja, Sie können jedes Commit so pushen.