Jusqu'à présent, toutes les réponses ne répondent pas à la préoccupation finale:
Existe-t-il une méthode efficace lorsqu'il y a des centaines de révisions après celle à supprimer?
Les étapes suivent, mais pour référence, supposons l'historique suivant:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C : commit juste après le commit à supprimer (clean)
R : le commit à supprimer
B : commit juste avant le commit à supprimer (base)
En raison de la contrainte «des centaines de révisions», je suppose les conditions préalables suivantes:
- il y a un engagement embarrassant que vous souhaiteriez ne jamais avoir existé
- il y a ZERO commits ultérieurs qui dépendent réellement de ce commit embarrassant (zéro conflit lors du retour)
- vous ne vous souciez pas que vous serez répertorié comme le «Committer» des centaines de commits intermédiaires («Author» sera conservé)
- vous n'avez jamais partagé le référentiel
- ou vous avez en fait suffisamment d'influence sur toutes les personnes qui ont déjà cloné l'histoire avec cet engagement pour les convaincre d'utiliser votre nouvelle histoire
- et vous ne vous souciez pas de réécrire l'histoire
Il s'agit d'un ensemble de contraintes assez restrictif, mais il existe une réponse intéressante qui fonctionne réellement dans ce cas d'angle.
Voici les étapes:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
S'il n'y a vraiment pas de conflits, cela devrait se poursuivre sans autres interruptions. S'il y a des conflits, vous pouvez les résoudre et rebase --continue
ou décider de vivre avec l'embarras et rebase --abort
.
Maintenant, vous devriez être sur master
qui n'a plus validé R dedans. La save
branche indique où vous étiez avant, au cas où vous souhaiteriez vous réconcilier.
La façon dont vous souhaitez organiser le transfert de tous les autres vers votre nouvel historique dépend de vous. Vous aurez besoin de connaître stash
, reset --hard
et cherry-pick
. Et vous pouvez supprimer les base
, remove-me
et les save
branches