Git

Tutorial de Git Rebase

Tutorial de Git Rebase

Se advierte a los principiantes de Git contra el comando rebase. Y con razón. Con todas las cosas nuevas que aprender, los principiantes probablemente estarán mejor si dominan los conceptos básicos antes de profundizar en las complejidades del rebase. Sin embargo, si comprende los conceptos básicos de la fusión de ramas, entonces saber cómo rebasar puede ayudarlo a resolver algunos acertijos de desarrollo complicados cuando llegue el momento adecuado.

Git Rebase: Definiciones

De acuerdo con la documentación de git, el comando rebase volverá a aplicar confirmaciones sobre otra sugerencia base. Esta definición puede ser un poco abrumadora. Es más fácil explicar el rebase como un procedimiento que agrega los cambios de la rama actual a la cola de otra rama. Repasemos un ejemplo para tener una mejor idea de lo que sucede.

Ejemplo de cambio de base de Git

En este ejemplo, primero crearemos un caso de prueba con la rama 'master' y 'feature'. Entonces haremos una fusión estándar. A continuación, recrearemos el caso de prueba y realizaremos un rebase y fusionar.

1. Creación de ramas maestras y de funciones

Aquí está el escenario que crearemos:

A - B - C (maestro) \ E - F (función) 

En el ejemplo anterior, tomamos la siguiente ruta:

  1. Compromiso A: agregamos un.txt en la rama 'maestra'
  1. Compromiso B: sumamos b.txt en la rama 'maestra'
  1. En esta etapa, creamos la 'característica' de la rama, lo que significa que tendrá una.txt yb.TXT
  1. Confirmar C: sumamos c.txt en la rama 'maestra'
  1. Vamos a la rama 'característica'
  1. Compromiso E: modificamos un.txt en la rama 'característica'
  1. Comprometerse F: modificamos b.txt en la rama 'característica'

Puede crear una carpeta y ejecutar el siguiente código dentro de la carpeta para crear la situación anterior:

git init toque un.txt git add -A git commit -m "Confirmación A: agregó un.txt "toque b.txt git add -A git commit -m "Confirmación B: agregada b.txt "git branch feature touch c.txt git add -A git commit -m "Confirmación C: agregada c.txt "git status git checkout feature echo aaa> a.txt git add -A git commit -m "Confirmación E: modificado un.txt "echo bbb> b.txt git add -A git commit -m "Confirmación F: modificado b.TXT" 

2. Fusión simple

Usemos el comando log para verificar ambas ramas.

Resultados para 'master':

$ git checkout master Se cambió a la rama 'master' $ git log --oneline 2bbde47 Commit C: agregado c.txt b430ab5 Commit B: agregado b.txt 6f30e95 Commit A: se agregó un.txt $ ls a.txt b.txt c.TXT 

Resultados para 'función':

$ git checkout feature Cambiado a la rama 'feature' $ git log --oneline 0286690 Commit F: modificado b.txt 7c5c85e Commit E: modificado a.txt b430ab5 Confirmación B: agregado b.txt 6f30e95 Commit A: se agregó un.txt $ ls a.txt b.TXT 

Observe cómo la rama de características no tiene Commit C

Ahora ejecutemos la rama fusionar 'característica' con la rama 'maestra'. Se le pedirá que ingrese un comentario. En el comentario, agregue "Confirmación G:" al principio para facilitar el seguimiento.

$ git checkout master Se cambió a la rama 'master' $ git merge feature Fusión realizada por la estrategia 'recursiva'. a.txt | 1 + b.txt | 1 + 2 archivos modificados, 2 inserciones (+) 

Resultados para 'master':

 $ git checkout master Ya en 'master' $ git log --oneline d086ff9 Commit G: Merge branch 'feature' 0286690 Commit F: modificado b.txt 7c5c85e Commit E: modificado a.txt 2bbde47 Commit C: agregado c.txt b430ab5 Commit B: agregado b.txt 6f30e95 Commit A: se agregó un.txt $ ls a.txt b.txt c.TXT 

Resultados para 'función':

$ git checkout feature Cambiado a la rama 'feature' $ git log --oneline 0286690 Commit F: modificado b.txt 7c5c85e Commit E: modificado a.txt b430ab5 Commit B: agregado b.txt 6f30e95 Commit A: se agregó un.txt $ ls a.txt b.TXT 

En la rama 'maestra', notará que hay una nueva confirmación G que ha fusionado los cambios de la rama 'característica'. Básicamente, se ha llevado a cabo la siguiente acción:

A - B - C - G (maestro) \ / E - F (función) 

En el compromiso G, todos los cambios de la rama 'característica' se han llevado a la rama maestra. Pero la rama de 'función' en sí no se ha modificado debido al proceso de fusión. Observe el hash de cada confirmación. Después de la fusión, la confirmación E (7c5c85e) y F (0286690) tiene el mismo hash en la rama 'característica' y 'maestra'.


3. Fusionar con Rebasing

Repitamos el paso 1 para crear las ramas 'maestra' y 'característica' nuevamente.

Resultados para 'master':

$ git checkout master Se cambió a la rama 'master' $ git log --oneline 7f573d8 Commit C: agregado c.txt 795da3c Confirmación B: agregado b.txt 0f4ed5b Commit A: agregó un.txt $ ls a.txt b.txt c.TXT 

Resultados para 'función':

$ git checkout feature Cambiado a la rama 'feature' $ git log --oneline 8ed0c4e Commit F: modificado b.txt 6e12b57 Commit E: modificado a.txt 795da3c Confirmación B: agregado b.txt 0f4ed5b Commit A: agregó un.txt $ ls a.txt b.TXT 

Cambiemos de base desde la rama 'característica'.

$ git checkout feature Se cambió a la rama 'feature' $ git rebase master Primero, rebobinando la cabeza para reproducir su trabajo encima ... Aplicando: Confirmar E: modificado a.txt Aplicando: Confirmación F: modificado b.TXT 

Luego fusiona 'característica' en 'maestro'.

$ git checkout master Se cambió a la rama 'master' $ git merge feature Actualizando 7f573d8… 9efa1a3 Avance rápido a.txt | 1 + b.txt | 1 + 2 archivos modificados, 2 inserciones (+) 

Resultados de la rama 'maestra':

$ git checkout master Ya en 'master' $ git log --oneline 9efa1a3 Commit F: modificado b.txt 8710174 Confirmación E: modificado a.txt 7f573d8 Confirmación C: agregado c.txt 795da3c Confirmación B: agregado b.txt 0f4ed5b Commit A: agregó un.txt $ ls a.txt b.txt c.TXT 

Resultados de la rama 'característica':

$ git checkout feature Cambiado a la rama 'feature' $ git log --oneline 9efa1a3 Commit F: modificado b.txt 8710174 Confirmación E: modificado a.txt 7f573d8 Confirmación C: agregado c.txt 795da3c Confirmación B: agregado b.txt 0f4ed5b Commit A: agregó un.txt $ ls a.txt b.txt c.TXT 

Tenga en cuenta que después de rebase y fusionar ambas ramas son iguales. Además, los valores hash de E y F han cambiado en ambas ramas. Básicamente, en el escenario de rebase, esto es lo que sucedió:

A - B - C \ E '- F' (función, maestro) 

Por eso no hay un nuevo compromiso. Las confirmaciones E y F se han vuelto a calcular y se han bloqueado al final de la rama 'maestra'.

Rebasing es una herramienta útil cuando desea limpiar el historial de su trabajo. Sin embargo, existe un peligro que ha dado origen a la regla de oro.


Regla de oro de la reconfiguración

La regla de oro del rebase es:

Nunca rebase una rama pública.

Como puede ver en el ejemplo anterior, rebasar recalcula las confirmaciones. Cuando varias personas se ramifican desde un repositorio público, la reorganización puede crear situaciones en las que los desarrolladores que han creado nuevas ramas se encontrarán con situaciones de fusión muy complicadas. Por lo tanto, es una buena idea no volver a establecer la base de las ramas públicas que se comparten.

En conclusión:

Rebasar es una característica única de Git. Pero úsalo con precaución.

Más información:

Aquí hay algunos enlaces para un estudio más detallado:

Documentación de Git Rebase
Fusión de Atlassian frente a cambio de base

Referencias:

Vuelva a asignar los botones del mouse de manera diferente para diferentes programas con X-Mouse Button Control
Tal vez necesite una herramienta que pueda hacer que el control de su mouse cambie con cada aplicación que use. Si este es el caso, puede probar una a...
Revisión del mouse inalámbrico Microsoft Sculpt Touch
Recientemente leí sobre el Microsoft Sculpt Touch mouse inalámbrico y decidí comprarlo. Después de usarlo por un tiempo, decidí compartir mi experienc...
Trackpad en pantalla y puntero del mouse AppyMouse para tabletas Windows
Los usuarios de tabletas a menudo pierden el puntero del mouse, especialmente cuando son habituales para usar las computadoras portátiles. Los teléfon...