Supongamos que deseamos tener dos copias locales de un repositorio remoto sincronizadas a diferentes ramas. Por ejemplo una copia local sincronizada contra una rama"estable" (para mostrar la versión de una aplicación en producción) y otra sincronizada a una rama de desarrollo o inestable (para mostrar la versión de una aplicación en desarrollo o pruebas). Este artículo explica como crear, sincronizar y clonar ramas en git desde línea de comandos.



Partiendo de un repositorio que posee una única rama de desarrollo llamada "master", el objetivo es crear una rama estable (donde aplicar cambios estables a largo plazo y probados) y otra inestable o de desarrollo (donde avanzar con el desarrollo del proyecto sin alterar la rama estable en producción).

Antes de comenzar, veamos el estado de la copia local del repositorio.

Estado de una copia local

Para obtener información sobre la rama actual basta con recurrir al comando git status o git branch:

root@debian:/var/www/recoll-webui# git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Mientras que git status muestra la rama actual en la primera línea de la salida, git branch lista todas las ramas marcando con asterisco la rama actual:

root@debian:/var/www/recoll-webui# git branch
* master

Se observa entonces que el repositorio tiene una única rama llamada "master" (rama por defecto al crear un repositorio con git).

Crear ramas

Para crear una nueva rama, ejecutar git branch pasando el nombre de la rama como parámetro. En el siguiente ejemplo se crean dos nuevas ramas, "estable" y "desarrollo":

root@debian:/var/www/recoll-webui# git branch estable
root@debian:/var/www/recoll-webui# git branch desarrollo

Ahora git branch muestra todas las ramas, resaltando con asterisco la rama "master":

root@debian:/var/www/recoll-webui# git branch
  desarrollo
  estable
* master

Cambiar de rama en una copia local

Supongamos que se desea mantener esta copia local como versión de producción. El siguiente paso consiste entonces en cambiar a la rama "estable". Para cambiar de rama se dispone del comando git checkout:

root@debian:/var/www/recoll-webui# git checkout estable
Switched to branch 'estable'

Ahora la copia local está sincronizada con la rama estable:

root@debian:/var/www/recoll-webui# git branch
  desarrollo
* estable
  master

En esta rama se subirán cambios estables una vez probados y verificados en la versión de desarrollo que estará sincronizada contra la rama "desarrollo". La idea es que el desarrollo (valga la redundancia) del proyecto avance en la rama "desarrollo" (inestable) mientras que la rama "estable" avance a largo plazo con cambios debidamente testeados.

root@debian:/var/www/recoll-webui# git status
On branch estable
nothing to commit, working tree clean

Enviar cambios al repositorio remoto

Habiendo creado nuevas ramas en la copia local, es deseable subirlas al repositorio. Para enviar estas nuevas ramas al remoto, es necesario hacer un checkout (cambiar de rama) y push (subir cambios) de cada una por separado.

Primero la rama "estable", a la cual se ha cambiado en el paso anterior:

root@debian:/var/www/recoll-webui# git push -u origin estable
Total 0 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for estable, visit:
remote:   https://gitlab.linuxito.com/emiliano/recoll-webui/merge_requests/new?merge_request%5Bsource_branch%5D=estable
remote: 
To https://gitlab.linuxito.com/emiliano/recoll-webui.git
 * [new branch]      estable -> estable
Branch 'estable' set up to track remote branch 'estable' from 'origin'.

Lo mismo para la rama "desarrollo":

root@debian:/var/www/recoll-webui# git checkout desarrollo
Switched to branch 'desarrollo'
root@debian:/var/www/recoll-webui# git push -u origin desarrollo
Total 0 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for desarrollo, visit:
remote:   https://gitlab.linuxito.com/emiliano/recoll-webui/merge_requests/new?merge_request%5Bsource_branch%5D=desarrollo
remote: 
To https://gitlab.linuxito.com/emiliano/recoll-webui.git
 * [new branch]      desarrollo -> desarrollo
Branch 'desarrollo' set up to track remote branch 'desarrollo' from 'origin'.

De forma alternativa, y más simple, es posible recurrir al comando git push --all origin para enviar todos los cambios de todas las ramas de una vez.

Clonar una rama específica

Tenemos nuestra copia local en el directorio /var/www/recoll-webui sincronizada contra la rama "estable". Esta copia local corresponde a la aplicación en producción donde se aplicarán cambios estables a largo plazo y debidamente testeados.

A continuación se procede con el clonado de una nueva copia local en el directorio /var/www/recoll-webui-desa, sincronizada contra la rama "desarrollo". Esta copia local corresponde a la aplicación en testing.

Es posible clonar una rama específica de un repositorio pasándola como parámetro a la opción --branch:

root@debian:/var/www/recoll-webui# cd ..
root@debian:/var/www# git clone --branch desarrollo https://gitlab.uns.edu.ar/emiliano/recoll-webui.git recoll-webui-desa
Cloning into 'recoll-webui-desa'...
remote: Enumerating objects: 320, done.
remote: Total 320 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (320/320), 137.10 KiB | 19.58 MiB/s, done.
Resolving deltas: 100% (194/194), done.

Veamos si está sincronizada contra la rama correcta:

root@debian:/var/www# cd recoll-webui-desa/

Notar que esta copia local no posee todas las ramas, sino sólo "desarrollo":

root@debian:/var/www/recoll-webui-desa# git branch
* desarrollo

Mantener las copias locales sincronizadas

De esta forma podemos tener dos copias locales de un repositorio en un servidor apuntando a ramas diferentes: una estable para el sitio en producción y una de desarrollo para el sitio en desarrollo/prueba. Sólo restar configurar Apache/Nginx para que el alias o nombre de host de desarrollo apunte a este nuevo directorio.

Ahora a picar código y pushear a la rama "desarrollo".

Desde el lado servidor sólo se debería correr git pull periódicamente para bajar los cambios introducidos en la rama "desarrollo".

En este ejemplo se está utilizando GitLab como gestor de repositorios. Sin embargo, si se ha creado un repositorio bare sobre un un servidor git montado de forma manual, anteriormente expliqué cómo implementar una estrategia de deploy automático en una copia local.

Referencias

  • man git-status
  • man git-branch
  • man git-checkout
  • man git-push
  • man git-clone
  • man git-pull


Tal vez pueda interesarte


Compartí este artículo