he hablado antes sobre cómo la historia de una base de código es tan importante como la propia base de código. Rebase es la herramienta que puede tener el mayor impacto para lograr esto. El conocimiento previo de los conceptos fundamentales del control de fuentes es crucial para entender este post.,

recuerde, a pesar de que puede usar Rebase para los siguientes (y tal vez más) casos, sigue siendo la mejor práctica confirmar temprano y con frecuencia:

  • editar/volver a trabajar una confirmación en el historial
  • añadir una confirmación en el historial de un conjunto de cambios (o rama)
  • eliminar una confirmación del historial de un conjunto de cambios (o rama)
  • dividir una confirmación en varias confirmaciones
  • combinar una serie de confirmaciones en una confirmación
  • /li>
  • Cambios de orden

¿qué significa rebase?,

git-rebase – reaplicar confirmaciones sobre otra punta base

git-rebase

si reemplaza la palabra ‘base’ por ‘ancestro’ significa lo mismo, por lo que en otras palabras:

dar un nuevo antepasado a un commit o secuencia de commits.

‘base’ se usa en la documentación para permitir que la base signifique una rama, un commit, una etiqueta o cualquier otra cosa a la que se pueda hacer referencia dentro de git.,

como se discutió anteriormente, un commit contiene-entre otras cosas-el id de su(s) commit (s) padre (s). Como tal Rebase está actualizando efectivamente la confirmación principal para el conjunto de confirmaciones que usted proporciona.

también es importante recordar que cada commit en Git es inmutable, incluso para Rebase. Como tal, Rebase recreará cada commit, encadenándolos todos juntos pero con el nuevo ancestro.

Rebase es un poco como el Almanaque deportivo de los grises: ¡puede cambiarlo todo!
From tenor.com

las reglas!,

cuando se usa Rebase, hay ciertas reglas que debe cumplir, de lo contrario, puede producirse un mundo de dolor.

  1. Nunca Rebase una rama pública – una que otras personas están usando

recuerde que Rebase tiene que seguir las reglas de un commit – que es inmutable. Como tal, se creará un nuevo commit para cada paso del proceso. Esto significa que ‘tirarías la alfombra de debajo de los pies’ de cualquiera que use el ‘viejo’ commit.,

Git verá que la confirmación existe dos veces – la primera versión y la versión rebasada-y potencialmente se confundirá cuando intente combinar los cambios. Además, el historial mostrará la confirmación dos veces, aunque con diferentes ID. Un poco como tener dos Marty en la misma línea de tiempo – confuso!

Más información:

  • Rebasing rules

What if it goes wrong

Al igual que con Back to the Future, siempre hay una manera de salir de cualquier problema que pueda surgir., A medida que Rebase crea nuevas confirmaciones, la rama se puede restablecer de nuevo a la confirmación anterior y estás de vuelta donde estabas antes. Sugiero que siempre envíes tu rama a remoto antes de usar Rebase, especialmente si estás menos familiarizado con ella. Solo agrega otro nivel de seguridad en caso de que lo necesite.

antes de usar Rebase, toma nota de dónde estabas-Cuál es el ID de confirmación, o el nombre de la rama si no ha cambiado desde remote.,

si Rebase falla parcialmente y desea cancelar/abortar y volver a donde estaba antes, puede ejecutar: git rebase --abort

Si su rama fue empujada antes y desea restablecer el aspecto de la rama de forma remota: git reset --hard origin/<branch name>

Si solo tiene el ID de confirmación anterior: git reset --hard <commit SHA>

cada uno de los comandos descritos anteriormente restablecerá su rama actual a donde estaba antes de iniciar la actividad de rebase.,

lectura posterior:

  • git-rebase

Interactive Rebase

Rebase se puede utilizar en uno de los dos modos diferentes, interactivo y no interactivo. Ambos hacen lo mismo, pero la edición interactiva permite la manipulación del proceso.

así que hemos descrito Rebase como una herramienta que puede proporcionar un nuevo antepasado a un conjunto de confirmaciones. Rebase creará un ‘script’ (algo así como una lista de tareas pendientes) cuyas confirmaciones se verán afectadas. La versión no interactiva de Rebase produce este script y luego lo ejecuta inmediatamente.,

la versión interactiva permite editar este script antes de ejecutarlo.

el script es simplemente un conjunto ordenado de comandos a ejecutar. Es un archivo de texto que contiene cada commit id y lo que se debe hacer con él. El mensaje para cada confirmación se incluye para mayor claridad.

Un ejemplo interactivo de Reajuste de la secuencia de comandos se ve así:

pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post

En el ejemplo anterior, pick significa agregar el commit dado como un niño en la previa confirmación. Así que la historia, desde la base dada se verá exactamente como la proporcionada anteriormente., El script funciona de arriba a abajo, por lo que el commit en la parte inferior será el último commit añadido a la rama.

Puede elegir diferentes comandos en lugar de pick, son:

en muchos casos puede causar conflictos de fusión a medida que la Rebase avanza a través de su script. Esto es normal y nada de qué preocuparse. Solo tendrás que resolver los conflictos antes de poder proceder. Si este es el caso, use git mergetool para resolver los conflictos. Una vez que estén todos resueltos use git rebase --continue para continuar el proceso., Por supuesto, si desea abortar el proceso de Rebase, use git rebase --abort.

vale la pena señalar que Rebase es lo suficientemente inteligente como para crear Solo nuevas confirmaciones donde sabe que algo ha cambiado. Si el padre de un commit es el mismo que antes, mantendrá el commit tal cual y continuará hasta que tenga algo de trabajo por hacer. A continuación se presentan algunos ejemplos para demostrar los usos de Rebase para varios fines. Todos suponen que la’ base ‘ ha cambiado, y como tal Rebase tiene trabajo que hacer en cada paso del proceso.,

editar / reelaborar una confirmación en el historial

considere el escenario en el que necesita corregir un error tipográfico en un archivo. Quieres editar el commit para que el commit sea limpio y apropiado-no quieres tener otro commit que arregle el error más tarde.,=»5779374de0″>

  • espere a que edite/modifique la confirmación 449486aa
  • Add commit 3d4e82be, estableciendo su padre en el nuevo id para 449486aa
  • en el paso 4 puede hacer los cambios que necesita y modificar la confirmación, por ejemplo:

    1. modificar el archivo
    2. stage the file (git add <file>)
    3. confirmar el archivo, modificando la confirmación (git commit --amend)

    Cuando haya terminado necesita ejecutar git rebase --continue para continuar con el paso 5 y completar el proceso.,

    corregir un error tipográfico en un mensaje de confirmación

    el comando reword es el mismo que el comando edit, excepto que solo solicita que se modifique el mensaje en lugar del contenido de la confirmación, por ejemplo:

    pick 509de5ac New post - Building performant large scale web applications (#1344)reword 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post

    no lo olvides, cambiar el mensaje en el script no cambia el contenido del mensaje de confirmación. Guarde y cierre el script y espere a que Rebase vuelva a abrir el editor de mensajes para las confirmaciones elegidas.,

    agregar un commit en el historial de un conjunto de cambios (o rama)

    considere el escenario donde necesita hacer un cambio adicional a la base de código después de un commit. Te has olvidado de hacerlo, y quieres asegurarte de que está en el lugar correcto en la historia – justo después del commit apropiado., 509de5ac

  • espere a que realice los cambios que necesita
  • Add commit 3d4e82be, estableciendo su padre en el nuevo id para el nuevo commit que ha creado
  • en lugar de editar 449486aa puede agregar un nuevo commit en su lugar, por ejemplo:

    1. hacer el cambio/s
    2. stage the file/s (git add <file>)
    3. confirmar el cambio/s (git commit)

    Cuando haya terminado las modificaciones que necesita ejecutar git rebase --continue para continuar con el paso 5 y completar el proceso., Al final del proceso Tendrás 4 confirmaciones en el historial en lugar de 3.

    eliminar una confirmación del historial de un conjunto de cambios (o rama)

    considere el escenario en el que ha confirmado un cambio que no desea conservar y desea eliminarlo del historial. Tal vez haya enviado un cambio temporal que desea expulsar de la rama antes de fusionarla.,

    Usted puede editar el script para que muestre algo como lo siguiente:

    pick 509de5ac New post - Building performant large scale web applications (#1344)pick 3d4e82be Add fundamentals blog post

    tenga en cuenta que la línea 2 (449486aa) se ha eliminado, por lo que no será incluido en el proceso.,

    Cuando usted guardar, a continuación, cierre el archivo, Reajuste de la voluntad:

    1. Restablecer la rama de la base
    2. Añadir commit 509de5ac, la configuración de su padre a la base
    3. Añadir commit 3d4e82be, configuración de su padre el nuevo id 509de5ac

    al final del proceso tendrás 2 se compromete en la historia en lugar de 3.

    divida una confirmación en varias confirmaciones

    considere el escenario en el que accidentalmente ha confirmado dos cambios en la misma confirmación., Desea dividirlos para que el historial esté limpio; de modo que si es necesario en el futuro, parte del commit se pueda revertir sin revertir todo.,»>

    Cuando guarde y cierre el archivo, Rebase:

    1. restablecerá la rama a la base
    2. Add commit509de5ac, estableciendo su padre a la base dada
    3. Add commit449486aa, estableciendo su padre a la nueva ID for509de5ac
    4. espere a que edite/modifique este commit
    5. Add commit3d4e82be, estableciendo su padre en el nuevo ID para el último commit que agregó durante el paso 4

    en lugar de editar el commit, lo restablece, deshaciendo el paso 2, pero manteniendo los cambios en el disco.,

    para que pueda ejecutar git reset HEAD~1. Esto eliminará la confirmación y colocará todos los cambios en su copia de trabajo. Desde allí puede agregar selectivamente los archivos en confirmaciones individuales, es decir,

    1. git add <file1> luego git commit -m <message 1>
    2. git add <file2> luego git commit -m <message 2>

    Cuando haya terminado las modificaciones que necesita, ejecute git rebase --continue para continuar con el paso 5 y completar el proceso. Al final del proceso tendrás 5 (o más) confirmaciones en el historial en lugar de 3.,

    Combine una serie de confirmaciones en una confirmación

    considere el escenario, ha hecho algunas confirmaciones y deben fusionarse: no tienen sentido por sí solas o por alguna otra razón.,p>Puede editar el script para que muestre algo como lo siguiente:

    pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)squash 3d4e82be Add fundamentals blog post

    Cuando guarde y cierre el archivo, Rebase:

    1. restablecerá la rama a la base
    2. Add commit 509de5aca la base dada
    3. Add commit a commit contiene los cambios de449486aa y3d4e82be, estableciendo su padre al nuevo ID para 509de5ac
      1. rebase se detendrá y pedirá un mensaje, que se prepara como una combinación de ambos mensajes de confirmación, I.,e. «Source control-when blog post (#1345) Add fundamentals blog post»
      2. Si desea tomar el mensaje de la primera confirmación tal cual, use el comando fixup en lugar de squash.

    Se puede squash o fixup como muchos comete como te gusta – que no se limita a 2 comete en un momento. Cuando el editor de mensajes se guarda y se cierra (si está utilizando squash) Rebase continuará hasta el final del script., Al final del proceso Tendrás 2 confirmaciones en el historial en lugar de 3. La última confirmación tendrá el mensaje que ingresaste en el editor de mensajes durante el paso 3. Git será por defecto concatenar los mensajes juntos, cuando se utiliza squash y utilizar el primer mensaje cuando se utiliza fixup.

    reordenar confirmaciones

    considere el escenario, ha realizado algunos cambios, pero tienen más sentido si están en un orden diferente.,

    Usted puede editar el script para que muestre algo como lo siguiente:

    pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog postpick 509de5ac New post - Building performant large scale web applications (#1344)

    tenga en cuenta que la línea 1 se ha movido a la línea 3., Al guardar, a continuación, cierre el archivo, Reajuste de la voluntad:

    1. Restablecer la rama de la base
    2. Añadir commit 449486aa, la configuración de su padre a la base
    3. Añadir commit 3d4e82be, configuración de su padre el nuevo id 449486aa
    4. Añadir commit 509de5ac, la configuración de su padre el nuevo id 3d4e82be

    al final del proceso, usted tendrá el mismo se compromete, en un orden diferente.,

    no hay trabajo que hacer

    he mencionado anteriormente que Rebase es lo suficientemente inteligente como para no crear nuevas confirmaciones donde no es necesario, es decir, cuando la base/padre es la misma que antes., Esto es lo que sucede si usted no modificar el guión inicial, por lo tanto, todavía se ve como este, cuando se cierre el editor:

    pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post
    1. Restablecer la rama a la base, que es el mismo que el de los padres de 509de5ac
    2. Añadir commit 509de5ac, el padre es el mismo, No hay otros cambios son necesarios para que el commit puede usarse como está
    3. Añadir commit 449486aa, el padre es el mismo: 509de5ac., No se requieren otros cambios para que la confirmación se pueda usar tal cual
    4. Add commit 3d4e82be, el padre es el mismo: 449486aa. No se requieren otros cambios, por lo que el commit se puede usar tal cual

    al final del proceso nada habrá cambiado en la rama-todos los commits seguirán existiendo y en el mismo orden. En verdad Rebase es aún más inteligente que esto, pero estoy usando esta simplificación para demostrar que Rebase solo recreará commits cuando sea necesario.,

    leer Más

    • Git rebase
    • Reajuste reglas