¿Puedo elegir fragmentos de forma interactiva de otra confirmación de git?

3 minutos de lectura

¿Puedo elegir fragmentos de forma interactiva de otra confirmacion de
krosenvold

Estoy buscando exactamente el mismo comportamiento que

git add -i -p

Pero en lugar de redactar una confirmación desde mi directorio de trabajo, me gustaría redactar mi directorio de trabajo desde (partes de) una confirmación. Cómo puedo hacer eso ?

Mi caso de uso es que tengo varias funciones distintas que se agrupan en una sola confirmación y me gustaría probarlas una por una.

Utilizando cherry-pick -n no es realmente satisfactorio, ya que me deja con el trabajo sucio de eliminar todo el código no requerido. Realmente me gustaría elegir los cambios seleccionados que quiero probar.

  • Bueno, la solución real es dividir las confirmaciones, por lo que no tendrá que eliminar ‘todo el código no requerido’ en primer lugar. Mi dinero está en la selección de cerezas, no en el reinicio de git (siempre un poco peligroso)

    – seje

    03 may.

  • Por supuesto, dividiré los compromisos, solo necesito averiguarlo. qué dividir (y qué descartar)

    – krosenvold

    03 may.

¿Puedo elegir fragmentos de forma interactiva de otra confirmacion de
Marc Mutz – mmutz

Usar cherry-pick -n no es realmente satisfactorio, ya que me deja con el trabajo sucio de eliminar todo el código no requerido. Realmente me gustaría elegir los cambios seleccionados que quiero probar.

El trabajo puede haber sido sucio antes, pero con la llegada de git checkout --patch, ahora puede descartar cambios de forma selectiva, similar a git add -p para añadir.

  • Oh, eso es dulce. Exactamente lo que necesitaba. Tenga en cuenta que podría ser prudente reorganizar/seleccionar la confirmación por encima de su confirmación objetivo si su objetivo no es un ancestro de la cereza.

    – krosenvold

    03 may. 11 en 19:52

  • Nota: esto realmente no selecciona cambios de una confirmación de manera consistente, ¡sino partes de un determinado estado de archivo! (posiblemente anulando/perdiendo otros cambios posteriores)

    – kxr

    28 ene.


podrías usar git reset --mixed HEAD^1 para revertir el índice, luego elija los trozos que desee con git add -i.

El reset revertirá el índice a la confirmación anterior (esencialmente anulando la confirmación de lo que fuera el HEAD), pero no tocará el árbol de trabajo. Ahora puede poner en escena los trozos que desee, cometerlos y tirar el resto con un git reset --hard HEAD.

  • +1 Como una nota muy pequeña, --mixed es el predeterminado para git reset, por lo que podría dejar esa opción fuera.

    –Mark Longair

    03 may. 11 en 10:13

Sobre la base de la gran respuesta de Cameron Skinner, ampliaré esto un poco para incluir el caso cuando tenga una rama con varias confirmaciones, tal vez fusionar confirmaciones, tal vez mucho “ruido” y desea seleccionar solo fragmentos muy específicos de él. (que fue exactamente lo que me paso hoy)

Sigue estos pasos:

git checkout source-branch
git checkout -b cherry-pick-branch # Gives you a new branch based on source-branch
git reset --mixed master

Esto lo dejará con una rama donde todos los cambios están en el sistema de archivos, pero nada se ha confirmado/preparado. Entonces usa git add -p para agregar selectivamente las partes que desea organizar, y luego confirme y presione como de costumbre.

trabajo sucio de eliminar todo el código no requerido

Si esto no es aceptable,

git cherry-pick -n ...         # Starting from clean status
git reset                      # unstage
git add -p / -i [<pathspec>…​]  # add hunks interactively
git restore .                  # wipe the rest (at root dir)

, por ejemplo, si desea fusionarse con cambios no confirmados o no desea estropear las marcas de tiempo, entonces use git apply así puede ser una opción más limpia:

git show <commit> | tee _.patch
edit _.patch                    # strip unwanted hunks
git apply -3 _.patch

(Siempre y cuando git cherry-pick y git apply no apoye -p directamente)

Nota: Métodos como git checkout / restore -p ... no revierta constantemente fragmentos de una confirmación específica, sino seleccione partes de un determinado estado del archivo, posiblemente perdiendo cambios en otras confirmaciones posteriores.

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad