La mejor forma de corregir una confirmación previa en GIT

Digamos que algunos dev trabajan en su twig y hacen esos commits:

A -> B -> C -> D -> E 

Soy el crítico y noté que en la confirmación B algunos files han sido modificados y no deberían serlo.

Estoy tratando de encontrar la mejor manera de resolver ese caso, me gustaría hacer:

 A -> B -> X -> Y -> C -> D -> E 

dónde:

  • X es un reverso de B
  • Y es B sin los cambios innecesarios

Estaba pensando en hacer lo que está siguiendo pero sé que no se vería exactamente igual:

  • git checkout -b en B
  • revertir B en X
  • hacer B de una mejor manera en Y
  • fusionar CDE en mi twig
  • poner todo de nuevo en la twig de desarrollo

¿Funciona lo anterior? ¿Es esta la mejor manera de hacerlo o hay una mejor manera?

NOTA: estoy interesado en escuchar cualquier solución que implique reescribir el historial también.

Como esta twig se ha empujado hacia arriba y se ha hecho pública, no reescriba su historial . Eso romperá las twigs de otros desarrolladores.

Lo que debes hacer es:

 A -> B -> C -> D -> E -> X -> Y 

Mantenga el historial hasta E (que supongo que es HEAD ). Luego git revert B que revertirá el commit erróneo como commit X Luego corrígelo con tu commit Y

Alternativamente, puede git revert -n B , que esperará con la confirmación y le permitirá editar la confirmación, teniendo así todas las correcciones en una única confirmación (solo X , no Y ). Esta es la manera más elegante de manejar este problema.

La reversión de B en sí misma es una confirmación separada, como usted mismo ha señalado (X) y (Y) es nuevamente una confirmación adicional sin files innecesarios. ¿Por qué no simplemente elimina el file innecesario y lo confirma una vez sin revertir la confirmación original? De esta manera: A -> B -> C -> D -> E -> Z donde commit Z elimina los files innecesarios si aún están allí.

Así que encontré una solución que se ajusta a mis necesidades usando rebase -i (no me importa reescribir el historial en este caso de twig de características)

  • git rebase -i A (la confirmación antes B)
  • git reset HEAD ^ 1 filename (haz esto tanto como necesites en files que no necesitan cambio)
  • git commit – enmienda
  • git rebase –continuar

Me gusta porque hace literalmente lo que necesitaba: eliminar los files manuales que quería eliminar de una confirmación y no combinarlos.

La respuesta de Yuval es el enfoque correcto para el desarrollo de esta twig, pero si esta es una twig de características que se está trabajando por separado de la twig principal y se fusionará en el futuro (por ejemplo, estas confirmaciones están en dev y la twig principal es master ) :

  1. Revertir en X y corregir en Y según la respuesta de Yuval
  2. Desarrollar como normal
  3. Al fusionar la function, ejecute git rebase -i master
  4. Mueva X e Y para seguir inmediatamente B
  5. Opcionalmente, marque X e Y como fixup y se aplastarán en B
  6. Arregle cualquier conflicto en C , D y E

Ahora tiene una twig de desarrollo local con los commits en el order que desee. Ahora puede fusionar esta twig en master y eliminar la twig de desarrollo; de esta manera, tienes la historia limpia que deseas sin romper el trabajo de desarrollo de nadie.