Revisando y luego editando un antiguo commit con git

En mi proyecto, tuve dos compromisos; A, y luego B, que fueron empujados al control remoto.

Sin embargo, me di count de que mis cambios en el compromiso B eran una mala idea y volví a cometer A utilizando el git checkout A

Luego hice algunos cambios para confirmar A, haciendo commit C, que es lo que quiero presionar a mi control remoto como el último commit. Sin embargo, cuando hago esto, solo empuja las diferencias entre A y C en la versión actual del control remoto, que es B; en otras palabras, aplica commit C para commit B.

¿Cómo puedo get mi copy local en el control remoto como una nueva confirmación, de modo que el historial de confirmación se vea como: A, B, C (es decir, sin revertir B, todavía quiero B en mi historial de confirmación)?

Si no desea reescribir el historial, simplemente debe confirmar una reversión para la confirmación B:

 git revert B git commit 

Podría crear un parche con diferencias entre A y C y aplicarlo encima de B para crear una nueva confirmación, como esta:

 git diff AC > patch.git git checkout B ... 

En este punto, asegúrese de que su directory de trabajo esté limpio.

 git apply patch.git ... 

El command de arriba cambiará solo el directory de trabajo. Por lo tanto, debe agregar los files usted mismo.

 git add ... git commit 

Puede usar una database interactiva que le permite barajar el order de las confirmaciones. Al ejecutar git rebase -i HEAD^^^ puedes volver a los últimos tres commits; se te dará un file con commits por hash. Simplemente edite el file moviendo las líneas hacia arriba / abajo para organizarlas en el order deseado, luego guarde el file y git aplicará esos cambios en ese order por usted.