Git merge/cherry-pick evitando la puesta en escena

5 minutos de lectura

avatar de usuario
Auxilio

Estoy tratando de hacer una selección selectiva con algunos cambios, pero no quiero confirmarlos en esta rama, solo quiero tenerlos localmente.

Para este propósito, estoy usando

git cherry-pick <hash> --no-commit

Sin embargo, esto los agrega automáticamente al escenario, y luego, tengo que restablecerlos manualmente usando

git reset HEAD <files>

¿No hay ninguna opción con git para hacer que cherry pick no se comprometa y no se agregue al índice?

algo como:

git cherry-pick <hash> --no-commit --no-stage

Sé que este truco haría lo que quiero, pero tendría que especificar todos los archivos en la confirmación:

Editar

Intenté también esto, pero también se agrega al índice.

git checkout hash -- <list of files>

Y estos archivos pueden no compartir la misma ruta común. estoy tratando de automatizarlo

  • ¿Qué tal dejar que git haga el compromiso de selección de cereza y luego restablecer ese? git reset HEAD~?

    – lukas-reineke

    24 de abril de 2018 a las 8:37

  • Esto todavía necesita una respuesta después de 2,5 años.

    – escamoso

    20 de enero de 2021 a las 6:30

  • Estoy tratando de hacer una selección selectiva con algunos cambios, pero no quiero comprometerlos en esta rama, solo quiero tenerlos localmente… Estoy tratando de automatizarlo.” Esto es algo que debería suceder muy raramente. Querer piezas de otras ramas con la suficiente frecuencia como para que desmontar sea una molestia indica que algo anda mal con el proceso. Creo que esto es un Problema XY. Sospecho que están tratando de usar Git como administrador de configuración.

    – Schwern

    13 abr 2021 a las 19:54


Una alternativa sería usar apply en vez de cherry-pick:

git show <commit> | git apply

Esto aplicará los cambios realizados en <commit> pero lo hará no agréguelos a la puesta en escena o cree una confirmación.

Cherry-pick es, tras bambalinas, una operación de fusión. Git realiza fusiones en el índice, así que no, no hay otra forma de hacerlo que no sea usar el índice/área de preparación. (Pero ver más abajo.)

Si no desea confirmar el resultado en la rama actual, simplemente use alguna otra rama (git checkout -b <newbranch>) o una CABEZA separada (ninguna rama en absoluto: git checkout --detach HEAD). También puede usar un restablecimiento mixto, como sugirió lucas-reineke en un comentario, para realizar la confirmación en la rama actual y luego mover la rama actual hacia atrás una confirmación. Esto tiene el efecto secundario de restablecer el índice para que coincida con el HEAD ajustado (post-cherry-pick), dejándolo con el estado que solicitó originalmente.

Puedes usar git cherry-pick -n HEAD seguido por git reset --mixed HEAD (sin nombres de ruta en la lista) para obtener el mismo resultado: la selección selectiva tiene lugar en el índice, actualizando el árbol de trabajo como un efecto secundario, sin confirmar, y luego el restablecimiento copia los archivos del HEAD confirme de nuevo en el índice, dejando el árbol de trabajo intacto. Tenga en cuenta que --mixed es el valor predeterminado, por lo que git reset sin que --soft o --hard lo hace --mixed incluso si no incluye un explícito --mixed (Sin embargo, es útil asegurarse de no cometer errores tipográficos en el comando).

Estas son las dos formas en que normalmente haría esto. Sin embargo, existe una posibilidad más: mientras que Git tiene la índice: el único índice distinguido que va con el árbol de trabajo principal para el repositorio: puede redirigir Git a su propio alternativa índice, usando el GIT_INDEX_FILE variable. Puede configurar esto con el nombre de un archivo temporal que aún no existe, ejecutar git reset para crear ese archivo de índice temporal y completarlo, luego ejecute git cherry-pick -n <commit> para actualizar el índice temporal. A continuación, puede desarmar GIT_INDEX_FILE y elimine el archivo temporal. El resultado es una selección personalizada que utiliza su índice temporal, en lugar del índice normal, que altera los archivos del árbol de trabajo como efecto secundario. Tenga en cuenta que esta es la misma cantidad de trabajo que hacer la selección en el índice normal y luego restablecer el índice normal. Sin embargo, puede ser útil para algún tipo de flujo de trabajo con guión. ¡Cuidado con las selecciones que fallan y, por lo tanto, dejan conflictos de combinación en el índice!

  • ¿No eliminaría git reset –mixed HEAD también de mis archivos de índice que había preparado previamente? ya que no estoy especificando la ruta

    – Auxilio

    24 de abril de 2018 a las 9:43

  • Sí el --mixed reset (sin pathspec) será establecer su índice de vuelta a la confirmación desde la que está reiniciando. Recuerde, el índice/área de ensayo contiene todos los archivos que están en el compromiso; git add copia un reemplazo en el índice cuando (una versión diferente de) el archivo ya estaba en el índice. Tenga en cuenta también que un simple (no--n) cherry-pick requiere que el índice esté “limpio”, es decir, coincida con la confirmación actual, cuando comience.

    – torek

    24 de abril de 2018 a las 14:45

  • @scaly: dado que la respuesta literalmente es “no puedes hacerlo” (porque la fusión ocurre en el índice), realmente no importa si te gusta la respuesta o no. Puede acercarse, pero no puede hacerlo sin crear un índice temporal o usar el índice principal.

    – torek

    20 de enero de 2021 a las 9:08

Pude lograr esto por

  1. Elija la confirmación en su rama
  2. reinicio de git –suave

¿Ha sido útil esta solución?