¿Cómo puedo dividir un compromiso de Git enterrado en la historia?
Error en mi historial y quiero hacerle algunos cambios. El problema es que tengo una confirmación con dos cambios no relacionados y esta confirmación está rodeada por otros cambios en mi historial local (no publicado).
Quiero dividir esta confirmación antes de publicarla, pero la mayoría de las guías que veo tienen que ver con dividir la confirmación más reciente o los cambios locales no confirmados. ¿Es factible hacer esto con una confirmación que está un poco enterrada en la historia, sin tener que "rehacer" mis confirmaciones desde entonces?
Hay una guía para dividir confirmaciones en la página de manual de rebase . El resumen rápido es:
Realice una rebase interactiva que incluya la confirmación de destino (p. ej.
git rebase -i <commit-to-split>^ branch
) y márquela para editarla.Cuando la rebase alcance ese compromiso, use
git reset HEAD^
para restablecer antes del compromiso, pero mantenga su árbol de trabajo intacto.Agregue cambios de forma incremental y confírmelos, realizando tantas confirmaciones como desee.
add -p
Puede resultar útil agregar solo algunos de los cambios en un archivo determinado. Úselocommit -c ORIG_HEAD
si desea reutilizar el mensaje de confirmación original para una confirmación determinada.Si desea probar lo que está comprometiendo (¡buena idea!), utilice
git stash
para ocultar la parte que no ha comprometido (ostash --keep-index
incluso antes de confirmarla), pruebe y luegogit stash pop
devuelva el resto al árbol de trabajo. Continúe realizando confirmaciones hasta que haya confirmado todas las modificaciones, es decir, tenga un árbol de trabajo limpio.Ejecute
git rebase --continue
para continuar aplicando las confirmaciones después de la confirmación ahora dividida.
Aquí se explica cómo hacerlo con Magit .
Digamos que el compromiso ed417ae es el que desea cambiar; contiene dos cambios no relacionados y está oculto bajo una o más confirmaciones. Presione ll
para mostrar el registro y navegue hasta ed417ae:
Luego presione r
para abrir la ventana emergente de rebase
y m
modificar el compromiso en el punto.
Observe cómo @
ahora hay en el compromiso que desea dividir; eso significa que HEAD ahora está en ese compromiso:
Queremos mover HEAD al padre, así que navegue hasta el padre (47e18b3) y presione x
( magit-reset-quickly
, vinculado a o
si está usando evil-magit
) e ingrese para decir "sí, quise decir confirmar en el punto". Su registro ahora debería verse así:
Ahora, presione q
para ir al estado normal de Magit, luego use el u
comando normal unstage para cancelar lo que no va en la primera confirmación, confirme c
el resto como de costumbre, luego s
etiquete y c
omita lo que va en la segunda confirmación, y cuando haya terminado: presione r
para abrir la ventana emergente de rebase
y otro r
para continuar, ¡y listo! ll
ahora muestra: