¿Cómo puedo dividir un compromiso de Git enterrado en la historia?

Resuelto Ben asked hace 14 años • 6 respuestas

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?

Ben avatar Nov 30 '10 02:11 Ben
Aceptado

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 -pPuede resultar útil agregar solo algunos de los cambios en un archivo determinado. Úselo commit -c ORIG_HEADsi desea reutilizar el mensaje de confirmación original para una confirmación determinada.

  • Si desea probar lo que está comprometiendo (¡buena idea!), utilice git stashpara ocultar la parte que no ha comprometido (o stash --keep-indexincluso antes de confirmarla), pruebe y luego git stash popdevuelva 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 --continuepara continuar aplicando las confirmaciones después de la confirmación ahora dividida.

Cascabel avatar Nov 29 '2010 19:11 Cascabel

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 llpara mostrar el registro y navegue hasta ed417ae:

registro inicial

Luego presione rpara abrir la ventana emergente de rebase

ventana emergente de rebase

y mmodificar 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:

modificando un compromiso

Queremos mover HEAD al padre, así que navegue hasta el padre (47e18b3) y presione x( magit-reset-quickly, vinculado a osi está usando evil-magit) e ingrese para decir "sí, quise decir confirmar en el punto". Su registro ahora debería verse así:

iniciar sesión después de restablecer

Ahora, presione qpara ir al estado normal de Magit, luego use el ucomando normal unstage para cancelar lo que no va en la primera confirmación, confirme cel resto como de costumbre, luego setiquete y comita lo que va en la segunda confirmación, y cuando haya terminado: presione rpara abrir la ventana emergente de rebase

ventana emergente de rebase

y otro rpara continuar, ¡y listo! llahora muestra:

registro de todo hecho

unhammer avatar Nov 12 '2018 10:11 unhammer