Todas las respuestas hasta ahora no abordan la preocupación final:
¿Existe un método eficiente cuando hay cientos de revisiones después de la que se eliminará?
Los pasos siguen, pero como referencia, supongamos el siguiente historial:
[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]
C : commit solo siguiendo el commit que se eliminará (clean)
R : El compromiso a eliminar
B : commit justo antes del commit a eliminar (base)
Debido a la restricción de "cientos de revisiones", estoy asumiendo las siguientes condiciones previas:
- hay un compromiso vergonzoso que desearías nunca haber existido
- hay CERO confirmaciones posteriores que realmente dependen de esa confirmación embarazosa (cero conflictos al revertir)
- no le importa que aparezca como el 'Comprador' de los cientos de confirmaciones que intervienen ('Autor' se conservará)
- nunca has compartido el repositorio
- o realmente tiene suficiente influencia sobre todas las personas que alguna vez han clonado la historia con ese compromiso para convencerlos de que usen su nueva historia
- y que no se preocupan acerca de la reescritura de la historia
Este es un conjunto de restricciones bastante restrictivo, pero hay una respuesta interesante que realmente funciona en este caso de esquina.
Aquí están los pasos:
git branch base B
git branch remove-me R
git branch save
git rebase --preserve-merges --onto base remove-me
Si realmente no hay conflictos, esto debería proceder sin más interrupciones. Si hay conflictos, puede resolverlos rebase --continueo decidir vivir con la vergüenza y rebase --abort.
Ahora debería estar en mastereso ya no tiene commit R en él. La saverama apunta a donde estabas antes, en caso de que quieras conciliar.
Depende de usted cómo desea organizar la transferencia de todos los demás a su nuevo historial. Usted tendrá que estar familiarizado con stash, reset --hardy cherry-pick. Y puede eliminar las base, remove-mey savelas ramas