Puede usar git checkout -p
, que le permite elegir trozos individuales desde la diferencia entre su copia de trabajo e índice para revertir. Del mismo modo, git add -p
le permite elegir lo que desea agregar al índice, y git reset -p
le permite elegir entre las diferencias individuales entre el índice y HEAD para salir del índice.
$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .
Si desea crear una instantánea de su repositorio git de antemano para preservar estos cambios antes de volver ellos, me gusta hacer:
$ git stash; git stash apply
Si se utiliza muy a menudo, es posible que desee crear un alias que:
[alias]
checkpoint = !git stash; git stash apply
Volviendo trozos o líneas individuales pueden ser aún más fácil si utiliza un buen modo de edición o plug-in, que puede proporcionar apoyo para la selección de líneas directamente a revertir, como -p
puede ser un poco torpe para usar a veces. Yo uso Magit, un modo Emacs que es muy útil para trabajar con Git. En Magit, puede ejecutar magit-status
, encontrar los diffs de los cambios que desea revertir, seleccionar las líneas que desea revertir (o simplemente colocar el cursor en los trozos que desea revertir si desea revertir un trozo a la vez) de una línea a la vez), y presione k
para revertir esas líneas específicas. Recomiendo Magit si usas Emacs.
Creo que esto es tan complejo como la solución que se me ocurrió originalmente, pero creo que mi solución original tiene el beneficio de guardar las líneas eliminadas durante 30 días porque están comprometidas. Estoy pensando que tal vez sería bueno tener un guión de shell escrito alrededor de él, sin embargo. – asmeurer
Disculpa, me acabo de dar cuenta de que 'git checkout' también tiene un indicador' -p', que hace exactamente lo que pedías en un solo comando. Disculpas por el complejo conjunto de pasos anterior; simplemente puede usar 'git checkout -p'. En cuanto a guardar cosas, antes de hacer algo potencialmente destructivo, a menudo hago un 'git stash'; git stash apply' (o crea un alias que hace eso como 'git checkpoint' o algo así) para registrar el árbol actual en un escondite para que pueda volver a él si algo sale mal. –
¡Ahí va, esa es la solución! En cuanto al alias, estoy pensando en algo como 'git commit -a -m" Backup Commit "--edit; git reset HEAD^' sería mejor, porque entonces no ensuciaría mi estado oculto, que podría estar usando para otra cosa. Luego, siempre que tengas SHA1 puedes elegirlo en los próximos 30 días. El --edit le permite agregar información al mensaje de confirmación para ayudarlo a encontrar el SHA1 más adelante si lo desea. Por otro lado, esto ensuciaría el refrito de git, así que supongo que es una compensación basada en lo que haces. – asmeurer