Git: mover cambios entre ramas sin cambiar el directorio de trabajo

4 minutos de lectura

avatar de usuario
denis.zhdanov

Caso de uso: cada vez que quiero mover la confirmación de una rama de git a otra, realizo la siguiente secuencia de acciones:

  1. [commit into working branch]
  2. git checkout rama-a-fusionar-en
  3. git cherry-pick destino-compromiso
  4. git push
  5. git checkout rama de trabajo

Eso funciona bien con la única excepción: cada vez que realizo ‘git checkout’, el contenido del directorio de trabajo de git cambia (se espera) y eso hace que mi IDE (IntelliJ IDEA) realice una actualización de estado interno (porque el subárbol del sistema de archivos monitoreado se modifica externamente ). Eso realmente molesta, especialmente en el caso de una gran cantidad de pequeños compromisos.

Veo dos caminos a seguir:

  1. realizar ‘selección masiva de cerezas’, es decir, realizar un gran número de confirmaciones; trasladarlos a otra sucursal, digamos, al final de la jornada laboral;
  2. tener un segundo repositorio local de git y realizar selecciones selectivas en él, es decir, cada vez que se realiza una confirmación y un envío reales a la rama de trabajo, vaya a ese segundo repositorio, extraiga los cambios y realice una selección selectiva allí;

No me gusta el primer enfoque porque es posible olvidarse de mover una confirmación en particular. El segundo parece un poco… antinatural.

Básicamente, sería perfecto si pudiera decir git ‘mover este compromiso de la rama con el nombre branchX a la rama branchX+1’ sin actualizar el directorio de trabajo.

Pregunta: ¿Es posible realizar lo anterior?

  • Opción 3: Indique a su editor que deje de interponerse en su camino.

    – rifa

    7 oct 2010 a las 12:16

  • ¿Le gustaría trabajar con un editor que no refleje los cambios de archivos externos?

    – denis.zhdanov

    7 oct 2010 a las 12:19

  • deberías cambiar el título a tu pregunta real

    – cmcginty

    7 oct 2010 a las 21:26


  • duplicado: stackoverflow.com/questions/3871512/…

    – cmcginty

    7 oct 2010 a las 21:32

  • ¿Crees que el título actual no refleja la pregunta real? El hilo mencionado apunta a otro problema

    – denis.zhdanov

    8 de octubre de 2010 a las 4:00


avatar de usuario
cmcginty

No, no es posible mover una confirmación entre ramas sin cambiar el directorio de trabajo. Esto se debe a que eventualmente se encontrará con un conflicto, momento en el que git se detiene para que pueda solucionar el conflicto. Si su trabajo directamente no representara ese estado, entonces no podría solucionar los conflictos correctamente.

Si mira a su alrededor, encontrará muchas otras posibles soluciones a este problema en SO, pero el problema subyacente parece que su editor no maneja los archivos que se cambian debajo de él. Esto es básicamente un hecho de usar git. Entonces, actualice el editor o muévase a algo más adecuado para un flujo de trabajo de git.

  • tienes razon que ahi pudo ocurrir un conflicto. Sin embargo, git podría intentar hacerlo de todos modos, y en caso de conflicto, se negaría y le diría que verifique la rama en la que se fusionará. Esto permitiría hacer lo que pides la mayor parte del tiempo. Suena como una buena solicitud de función.

    – Don Quixote

    22 de marzo de 2018 a las 1:44

Si no necesita fusionar sus cambios con frecuencia, en lugar de hacer cherry-pick¿qué tal hacer de vez en cuando un git merge <working branch> de tu <branch to merge into>? Esto sería el equivalente a decapar todos los cambios desde la última vez que se fusionó, si no me equivoco (no hay riesgo de olvidar una confirmación, con este enfoque). De esta manera, el “problema del editor” ocurriría con menos frecuencia.

  • Gracias por la sugerencia, pero según tengo entendido, la combinación traerá no solo mis confirmaciones, sino todas las confirmaciones entre las ramas. Es decir, la cantidad de confirmaciones realizadas por mí y mis colegas y quiero mover solo mis confirmaciones de destino a otra rama.

    – denis.zhdanov

    7 oct 2010 a las 14:51

  • @denis.zhdanov: Veo lo que necesita, ahora. No estoy seguro de cómo seleccionar automáticamente su comete…

    – Eric O Lebigot

    7 oct 2010 a las 17:07

Una opción para esto es usar git-worktree. Por ejemplo, puedes:

worktree_dir=$(mktemp -d)
git worktree add "$worktree_dir" branch-to-merge-into
git -C "$worktree_dir" cherry-pick target-commit
git -C "$worktree_dir" push
git worktree remove "$worktree_dir"

Siempre que no haya otro árbol de trabajo branch-to-merge-into desprotegido, esto debería funcionar sin interrumpir su pago local en absoluto.

¿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