Alle bisherigen Antworten sprechen nicht das nachfolgende Problem an:
Gibt es eine effiziente Methode, wenn nach der zu löschenden Version Hunderte von Revisionen vorliegen?
Die Schritte folgen, aber als Referenz nehmen wir den folgenden Verlauf an:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C : Festschreiben direkt nach dem zu entfernenden Festschreiben (sauber)
R : Das zu entfernende Commit
B : Festschreiben unmittelbar vor dem zu entfernenden Festschreiben (Basis)
Aufgrund der Einschränkung "Hunderte von Revisionen" gehe ich von folgenden Voraussetzungen aus:
- Es gibt ein peinliches Commit, von dem Sie sich wünschen, es gäbe es nie
- Es gibt NULL nachfolgende Commits, die tatsächlich von diesem peinlichen Commit abhängen (keine Konflikte beim Zurücksetzen).
- Es ist Ihnen egal, dass Sie als "Committer" der Hunderte von intervenierenden Commits aufgeführt werden ("Autor" bleibt erhalten).
- Sie haben das Repository noch nie freigegeben
- oder Sie haben tatsächlich genug Einfluss auf alle Menschen, die jemals Geschichte mit diesem Engagement geklont haben, um sie davon zu überzeugen, Ihre neue Geschichte zu verwenden
- und Sie kümmern sich nicht um die Geschichte umzuschreiben
Dies ist eine ziemlich restriktive Reihe von Einschränkungen, aber es gibt eine interessante Antwort, die in diesem Eckfall tatsächlich funktioniert.
Hier sind die Schritte:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
Wenn es wirklich keine Konflikte gibt, sollte dies ohne weitere Unterbrechungen erfolgen. Wenn es Konflikte gibt, können Sie diese lösen und / rebase --continueoder sich entscheiden, nur mit der Verlegenheit und zu leben rebase --abort.
Jetzt sollten Sie darauf sein, masterdass kein Commit R mehr darin enthalten ist . Der saveZweig zeigt auf Ihre vorherige Position, falls Sie eine Abstimmung durchführen möchten.
Wie Sie die Übertragung aller anderen auf Ihre neue Historie arrangieren möchten, liegt bei Ihnen. Sie müssen mit vertraut sein stash, reset --hardund cherry-pick. Und Sie können die löschen base, remove-meund saveZweige