Ich erweitere, was ich in einem Kommentar geschrieben habe
Die allgemeine Regel lautet, dass Sie eine Geschichte, die Sie veröffentlicht haben, nicht umschreiben (ändern) sollten, weil jemand seine Arbeit darauf aufgebaut haben könnte. Wenn Sie die Geschichte umschreiben (ändern), würden Sie Probleme beim Zusammenführen ihrer Änderungen und bei der Aktualisierung für sie verursachen.
Die Lösung besteht also darin, eine neue Verpflichtung die macht Änderungen rückgängig die Sie loswerden wollen. Sie können dies tun mit mit einem Git rückgängig machen Befehl.
Sie haben die folgende Situation:
A <-- B <-- C <-- D <-- master <-- HEAD
(Pfeile beziehen sich hier auf die Richtung des Zeigers: die "übergeordnete" Referenz im Fall von Commits, die oberste Commit im Fall von Branch Head (Branch Ref) und der Name des Branch im Fall von HEAD Reference).
Sie müssen Folgendes erstellen:
A <-- B <-- C <-- D <-- \[(BCD)\-1\] <-- master <-- HEAD
donde [(BCD)^-1]
bedeutet die Übergabe, die Änderungen in den Übergaben B, C, D rückgängig macht. Die Mathematik sagt uns, dass (BCD) -1 \= D -1 C -1 B -1 So können Sie mit den folgenden Befehlen die gewünschte Situation herstellen:
$ 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.
Eine alternative Lösung wäre, dass Zur Kasse Inhalt der Übergabe A, und übergeben Sie diesen Zustand. 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 ergibt sich die folgende Situation:
A <-- B <-- C <-- D <-- A' <-- master <-- HEAD
Die Übergabe A' hat denselben Inhalt wie Übergabe A, ist aber eine andere Übergabe (Übergabemeldung, Eltern, Übergabedatum).
Alternative Lösung von Jeff Ferland, geändert von Charles Bailey baut auf der gleichen Idee auf, verwendet aber Git-Reset . Hier ist es leicht modifiziert, dieser Weg 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