¿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?
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. Usocommit -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 (ostash --keep-index
antes de enviarla), pruebe, luegogit 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.
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:
-
Editar la confirmación antes
<commit>
git rebase -i <commit>^^
NB: quizás también será necesario editar
<commit>
también. -
Cherry pick
<commit>
en el índicegit cherry-pick -n <commit>
-
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"
-
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.
-
Continuar rebasando
git rebase --continue
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).
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