Git: gestión de sucursales

La operación de la sucursal permite crear otra línea de desarrollo. Podemos utilizar esta operación para dividir el proceso de desarrollo en dos direcciones diferentes. Por ejemplo, lanzamos un producto para la versión 6.0 y es posible que deseemos crear una rama para que el desarrollo de las características de la 7.0 se pueda mantener separado de las correcciones de errores de 6.0.

Crear rama

Tom crea una nueva rama usando el comando git branch <nombre de rama>. Podemos crear una nueva rama a partir de una existente. Podemos usar una confirmación o etiqueta específica como punto de partida. Si no se proporciona ningún ID de confirmación específico, la rama se creará con HEAD como punto de partida.

[[email protected] src]$ git branch new_branch

[[email protected] src]$ git branch
* master
new_branch

Se crea una nueva rama; Tom usó el comando git branch para listar las ramas disponibles. Git muestra una marca de asterisco antes de la rama actualmente desprotegida.

La representación gráfica de la operación de creación de sucursales se muestra a continuación:

Cambiar entre ramas

Jerry usa el comando git checkout para cambiar entre ramas.

[[email protected] src]$ git checkout new_branch
Switched to branch 'new_branch'
[[email protected] src]$ git branch
master
* new_branch

Acceso directo para crear y cambiar de rama

En el ejemplo anterior, hemos utilizado dos comandos para crear y cambiar ramas, respectivamente. Git proporciona–bopción con el comando de pago; esta operación crea una nueva rama e inmediatamente cambia a la nueva rama.

[[email protected] src]$ git checkout -b test_branch
Switched to a new branch 'test_branch'

[[email protected] src]$ git branch
master
new_branch
* test_branch

Eliminar una rama

Una rama se puede eliminar proporcionando la opción –D con el comando git branch. Pero antes de eliminar la rama existente, cambie a la otra rama.

Jerry está actualmente en test_branchy quiere quitar esa rama. Entonces cambia de rama y borra la rama como se muestra a continuación.

[[email protected] src]$ git branch
master
new_branch
* test_branch

[[email protected] src]$ git checkout master
Switched to branch 'master'

[[email protected] src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).

Ahora, Git mostrará solo dos ramas.

[[email protected] src]$ git branch
* master
new_branch

Cambiar el nombre de una rama

Jerry decide agregar soporte para caracteres anchos en su proyecto de operaciones de cadenas. Ya ha creado una nueva rama, pero el nombre de la rama no es apropiado. Entonces cambia el nombre de la rama usando–m opción seguida de la old branch name y el new branch name.

[[email protected] src]$ git branch
* master
new_branch

[[email protected] src]$ git branch -m new_branch wchar_support

Ahora, el comando git branch mostrará el nuevo nombre de la rama.

[[email protected] src]$ git branch
* master
wchar_support

Fusionar dos ramas

Jerry implementa una función para devolver la longitud de la cadena de una cadena de caracteres ancha. Nuevo, el código aparecerá de la siguiente manera:

[[email protected] src]$ git branch
master
* wchar_support

[[email protected] src]$ pwd
/home/jerry/jerry_repo/project/src

[[email protected] src]$ git diff

El comando anterior produce el siguiente resultado:

t a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..8fb4b00 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,4 +1,14 @@
#include <stdio.h>
+#include <wchar.h>
+
+size_t w_strlen(const wchar_t *s)
+
{
   +
   const wchar_t *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p - s);
   +
}

Después de la prueba, confirma y envía sus cambios a la nueva rama.

[[email protected] src]$ git status -s
M string_operations.c
?? string_operations

[[email protected] src]$ git add string_operations.c

[[email protected] src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t
string'

[wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string
1 files changed, 10 insertions(+), 0 deletions(-)

Tenga en cuenta que Jerry está impulsando estos cambios a la nueva rama, por lo que usó el nombre de la rama wchar_support en vez de master rama.

[[email protected] src]$ git push origin wchar_support  <−−− Observer branch_name

El comando anterior producirá el siguiente resultado.

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 507 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
* [new branch]
wchar_support -> wchar_support

Después de confirmar los cambios, la nueva rama aparecerá de la siguiente manera:

Tom siente curiosidad por saber qué está haciendo Jerry en su sucursal privada y comprueba el registro del wchar_support rama.

[[email protected] src]$ pwd
/home/tom/top_repo/project/src

[[email protected] src]$ git log origin/wchar_support -2

El comando anterior producirá el siguiente resultado.

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string


commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

Al ver los mensajes de confirmación, Tom se da cuenta de que Jerry implementó la función strlen para caracteres amplios y quiere la misma funcionalidad en la rama maestra. En lugar de volver a implementarlo, decide tomar el código de Jerry fusionando su rama con la rama maestra.

[[email protected] project]$ git branch
* master

[[email protected] project]$ pwd
/home/tom/top_repo/project

[[email protected] project]$ git merge origin/wchar_support
Updating 5776472..64192f9
Fast-forward
src/string_operations.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)

Después de la operación de fusión, la rama maestra aparecerá de la siguiente manera:

Ahora la rama wchar_supportse ha fusionado con la rama maestra. Podemos verificarlo viendo el mensaje de confirmación o viendo las modificaciones realizadas en el archivo string_operation.c.

[[email protected] project]$ cd src/

[[email protected] src]$ git log -1

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse 
      
        Date: Wed Sep 11 16:10:06 2013 +0530 Added w_strlen function to return string lenght of wchar_t string [[email protected] src]$ head -12 string_operations.c 
      

El comando anterior producirá el siguiente resultado.

#include <stdio.h>
#include <wchar.h>
size_t w_strlen(const wchar_t *s)
{
   const wchar_t *p = s;

   while (*p)
      ++p;

   return (p - s);
}

Después de la prueba, envía sus cambios de código a la rama maestra.

[[email protected] src]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To [email protected]:project.git
5776472..64192f9 master −> master

Rebase de ramas

El comando Git rebase es un comando de fusión de rama, pero la diferencia es que modifica el orden de las confirmaciones.

El comando de fusión de Git intenta poner las confirmaciones de otras ramas en la parte superior del HEAD de la rama local actual. Por ejemplo, su rama local tiene confirmaciones A-> B-> C-> D y la rama de fusión tiene confirmaciones A-> B-> X-> Y, entonces git merge convertirá la rama local actual en algo como A-> B−> C−> D−> X−> Y

El comando Git rebase intenta encontrar el ancestro común entre la rama local actual y la rama de fusión. Luego empuja las confirmaciones a la rama local modificando el orden de las confirmaciones en la rama local actual. Por ejemplo, si su rama local tiene confirmaciones A-> B-> C-> D y la rama de fusión tiene confirmaciones A-> B-> X-> Y, entonces Git rebase convertirá la rama local actual en algo como A- > B−> X−> Y−> C−> D.

Cuando varios desarrolladores trabajan en un único repositorio remoto, no puede modificar el orden de las confirmaciones en el repositorio remoto. En esta situación, puede usar la operación de rebase para poner sus confirmaciones locales encima de las confirmaciones del repositorio remoto y puede impulsar estos cambios.