¿Puedo revertir una confirmación específica tal que deje lo que se eliminaría como no instanciado en el file?

Aquí está el escenario:

-He hecho un montón de pequeñas y grandes modificaciones en mis files y no los cometí

– Decidí usar git commit --interactive y usar el command patch para organizar partes de confirmaciones

-Intenté dejar todas las confirmaciones relevantes cuando lo hice

-Descubrí después de múltiples commits que accidentalmente puse un cambio que se suponía que debía dejar en primer lugar hace 6 commits, así que revertí ese commit.

-El revertir borró el text relevante en el file, que es el comportamiento esperado.

El último paso es el que quiero modificar. Lo que quiero hacer es revertir una confirmación, pero dejo el text en el file para poder volver a escenificar la confirmación. La forma en que lo hice fue difiriendo la HEAD de la confirmación antes de revertir el commit, y luego copié y pegué el text y lo modifiqué para que no estuviera en formatting diff para poder usarlo en el file, y luego lo comprometí correctamente.

Me doy count de que necesito aprender el hábito de comprometerme temprano y con frecuencia. Todavía no me he acostumbrado, ya que le gusta interrumpir mi modo de pensar cuando me estoy desconectando.

La forma en que lo arreglé fue tedioso. ¿Hay alguna manera de dejar el text en un file que se eliminará en un reverso como si fuera un cambio no evaluado (algo así como reiniciar)? ¿Alguna sugerencia más allá de eso?

Puede ejecutar la reversión dos veces, y la última vez aplicar --no-commit que dejará los cambios en el índice listos para la confirmación:

 git revert <the commit you want back in the working tree> git revert HEAD --no-commit 

Los cambios ahora están organizados y listos para una nueva confirmación. Para dejar de funcionar, ejecuta:

 git reset HEAD 

Después de ejecutar el git revert BADCOMMIT , puede restaurar un file en particular a su estado anterior a la confirmación con:

 git checkout HEAD^ -- filename 

… que debería actualizar su copy de trabajo del filename de filename a su estado antes de revertir la confirmación. (La versión anterior también se representará en etapas, por lo que si quieres dejarla en segundo plano, haz que git reset HEAD -- filename después). No creo que haya una manera más fácil de hacerlo.

  git reset -p <COMMITHASH> 

Esto solicitará volver a aplicar el parche a su índice.

Recuerde que esto elegirá los cambios de la confirmación mencionada en el índice, lo que significa que intentará aplicar (a la inversa) las 6 confirmaciones anteriores a su índice. Debes elegir solo los cambios que deseas eliminar.

Después de revertir la confirmación, puede aplicar la reversión en reversa para "revertirla" solo en el tree de trabajo:

 git revert C && # you already did this part git show HEAD | git apply -R 

Por defecto, git apply solo parches al tree de trabajo. También tiene opciones para parchar solo el índice o ambos, el índice y el tree de trabajo. Entonces, en lugar de usar git revert , podrías haber usado git apply para aplicar los cambios en reversa solo al índice y luego commit (todo sin tocar el tree de trabajo):

 # assumption: we start with no staged changes, and have not reverted anything yet # revert C directly in the index (does not touch the working tree), then commit git show C | git apply --cached -R && git commit --edit -m'Reverted C'