¿Cómo puedo dividir una confirmación de Git enterrada en la historia?


He mejorado mi historia y quiero hacer algunos cambios en ella. El problema es que tengo un commit con dos cambios no relacionados, y este commit está rodeado de algunos otros cambios en mi historial local (no empujado).

Quiero dividir este commit antes de enviarlo, pero la mayoría de las guías que estoy viendo tienen que ver con dividir tu commit más reciente o cambios locales no comprometidos. ¿Es factible hacer esto a un commit que está enterrado en la historia un poco, sin tener que" re-hacer " mi commits desde entonces?

Author: APerson, 2010-11-29

3 answers

Hay una guía para dividir commits en la página de manual rebase. El resumen rápido es:

  • Realice una rebase interactiva que incluya la confirmación de destino (por ejemplo, git rebase -i <commit-to-split>^ branch) y márquela para editarla.

  • Cuando la rebase llegue a esa confirmación, usa git reset HEAD^ para restablecer antes de la confirmación, pero mantén intacto tu árbol de trabajo.

  • Añade los cambios de forma incremental y envíalos, haciendo tantas confirmaciones como desees. add -p puede ser útil para agregar solo algunos de los cambios en un archivo dado. Uso commit -c ORIG_HEAD si desea reutilizar el mensaje de confirmación original para una confirmación determinada.

  • Si quieres probar lo que estás cometiendo (¡buena idea!) use git stash para ocultar la parte que no ha enviado (o stash --keep-index antes de enviarla), pruebe, luego git stash pop para devolver el resto al árbol de trabajo. Sigue haciendo commits hasta que tengas todas las modificaciones confirmadas, es decir, que tengas un árbol de trabajo limpio.

  • Ejecutar git rebase --continue para proceder aplicando el commits después del commit ahora dividido.

 434
Author: Cascabel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:22

Para dividir un commit <commit> y agregar el nuevo commit antes de este, y guardar la fecha de autor de <commit>, - los pasos son los siguientes:

  1. Editar la confirmación antes <commit>

    git rebase -i <commit>^^
    

    NB: quizás también será necesario editar <commit> también.

  2. Cherry pick <commit> en el índice

    git cherry-pick -n <commit>
    
  3. Restablecer interactivamente los cambios innecesarios del índice y restablecer el árbol de trabajo

    git reset -p && git checkout-index -f -a
    

    Como alternativa, solo guarda los cambios innecesarios de forma interactiva: git stash push -p -m "tmp other changes"

  4. Haga otros cambios (si los hay) y cree la nueva confirmación

    git commit -m "upd something" .
    

    Opcionalmente, repita los elementos 2-4 para agregar más confirmaciones intermedias.

  5. Continuar rebasando

    git rebase --continue
    
 0
Author: ruvim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-03 12:11:52

Si aún no has pulsado, simplemente usa git rebase. Aún mejor, usa git rebase -i para mover las confirmaciones de forma interactiva. Puedes mover el commit ofensivo al frente, luego dividirlo como quieras y mover los parches hacia atrás (si es necesario).

 -1
Author: Gintautas Miliauskas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-29 19:11:36