Proyecto

General

Perfil

Trabajando con el control de versiones GIT

Git es un sistema de control de versiones o SCM (en inglés Source Code Management). El control de versiones es un sistema que registra los cambios realizados sobre un archivo de código fuente o un conjunto de archivos de código fuente a lo largo del tiempo, de modo que en un futuro se puedan recuperar versiones específicas más adelante. Git permite el versionado de código fuente tal como:

  • HTML / CSS / Javascript
  • PHP, .NET, Ruby, ASP, Python, entre otros
  • Archivos de configuración
  • Documentación
    … y un largo etc

¿Qué aporta git?

  • Auditoría del código: saber quién ha tocado qué y cuándo.
  • Control sobre cómo ha cambiado nuestro proyecto con el paso del tiempo.
  • Volver hacia atrás de una forma rápida.
  • Control de versiones a través de etiquetas.
  • Mejora nuestra capacidad de trabajar en equipo.

Buenas prácticas

Cada desarrollador o equipo de desarrollo puede hacer uso de Git de la forma que le parezca conveniente. Sin embargo una buena práctica es la siguiente:

Se deben utilizar 4 tipos de ramas: Master, Development, Features, y Hotfix.

Produccion

Es la rama principal. Contiene el repositorio que se encuentra publicado en producción, por lo que debe estar siempre estable.

Release

Es la rama de Entrenamiento. Contiene el repositorio que contiene los desarrollos que serán evaluados con data real (1 día de desfase con respecto a producción) sin que afecte producción.

QA

Es la rama de QA. Contiene el repositorio que contiene los desarrollos que serán revisados en QA antes de ser habilitados para producción.

Desarrollo

Es la rama de desarrollo inestable, todas las nuevas funcionalidades propuestas en las peticiones del sistema de proyectos (Redmine) se deben integrar en esta rama. Una vez que se verifique la funcionalidad, se puede hacer un merge de desarrollo sobre la rama Release.

Tareas asignadas (tarea/###)

Cada nueva funcionalidad se debe realizar en una rama nueva, específica para esa funcionalidad. Una vez que la funcionalidad se encuentre realizada, se hace un merge en desarrollo, donde se integrará con las demás funcionalidades.

Iniciando un proyecto

  1. Iniciar el proyecto
    git init
    
  2. Link al repositorio de INDAP
    git remote add origin sistemaunico@proyectos.indap.cl:~/git
  1. Descargar las cabeceras de las tareas desde el repositorio
    git fetch # git fetch nos permite descargar el estado actual de todas las ramas del repositorio con lo cual no es necesario crear ninguna rama ya existente
    
    git checkout produccion #para cambiarnos a la rama productiva
    git checkout release #para cambiarnos a la rama de release
    git checkout qa #para cambiarnos a la rama de QA
    git checkout desarrollo #para cambiarnos a la rama de desarrollo
    
  2. Todos los nuevos proyectos serán creados a partir de Produccion con el fin de tener la ultima actualización posible
git checkout produccion
git checkout -b Proyecto
git checkout -b Proyecto-qa
git checkout -b Proyecto-test
  1. Bajo la rama de Proyecto, se realizaran todas la tareas que se creen en las peticiones de proyectos.indap.cl, por lo tanto cualquier tarea asignada debe poseer su rama
    git checkout Proyecto
    git checkout -b tarea/###
    
  2. Realizar los add y commit correspondientes, una vez terminada la tarea cambiar desarrollo y unir con la rama de la tarea con la rama de desarrollo
    git add archivo/os
    git commit -m "comentario" 
    
    --una vez termina la tarea cambiar a desarrollo
    git checkout desarrollo
    git merge tarea/###
    
  3. Eliminar rama asociada a la tarea
    git branch -d tarea/###
    
  4. Cerrar la tarea en peticiones de proyectos.indap.cl

Creación de tareas

Para crear tareas lo primero que se debe conocer es si el proyecto esta en producción o en desarrollo, para lo cual se deben seguir las siguientes recomendaciones:

  1. Tarea desde proyecto en Producción. Estas tareas se crean desde la rama master. (* indica la rama actual donde estoy posicionado)
    $ git branch
        desarrollo
        entrenamiento
        master
        qa
      * tarea/1111
    $ git checkout master
    $ git checkout -b tarea/nueva-2222
    
  2. Tarea desde proyecto en Desarrollo. Estas tareas se crean desde la rama del proyecto. (* indica la rama actual donde estoy posicionado)
    $ git branch
        desarrollo
        entrenamiento
        master
        proyecto_XXX
        qa
      * tarea/1111
    $ git checkout proyecto_XXX
    $ git checkout -b tarea/nueva-2222
    

Subir cambios

Una vez que se termina de realizar cambios en archivos estos deben ser subidos a la tarea, para su posterior mezcla con otras ramas o simplemente para que estos se vean reflejados en el servidor de Desarrollo o QA. A continuación un ejemplo:

$ git status
On branch tarea/XXXX
Changes not staged for commit:                                                                                                                                                                                       
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   www/css/sig/base.css
        modified:   www/sirsd_sig_historico_region.js
        modified:   www/sirsd_sig_rut.php
        modified:   www/templates/sirsd_sig_historico_region.html

Se debe poner ojo en las lineas que comienzan con [modified:], ya que esta indican el/los archivos que se deben incluir. Seguir el siguiente ejemplo:

$ git add www/css/sig/base.css www/sirsd_sig_historico_region.js www/sirsd_sig_rut.php www/templates/sirsd_sig_historico_region.html
$ git commit -m "comentario de los cambios realizados" 
[tarea/XXXX 2be6ad5e9] comentario de los cambios realizados
 4 files changed, 130 insertions(+), 53 deletions(-)
git push origin tarea/XXXX
   password:
   Counting objects: 10, done.
   Delta compression using up to 8 threads.
   Compressing objects: 100% (9/9), done.
   Writing objects: 100% (10/10), 2.31 KiB | 0 bytes/s, done.
   Total 10 (delta 8), reused 0 (delta 0)
   To proyectos.indap.cl:/home/sirsd/git
      23f551658..2be6ad5e9  tarea/XXXX -> tarea/XXXX

Mezclando ramas

Para mezclar ramas se deben realizar como mínimo los pasos Creación de tareas y Subir cambios.

Las mezclas deben tener un orden que se debe respetar y es el siguiente:
  1. Mezclar hacia proyecto
  2. Mezclar hacia Desarrollo
  3. Mezclar hacia QA
  4. Finalizar mezclando con Master
  1. Saber en que rama se esta posicionado. (* indica la rama actual donde estoy posicionado)
    $ git branch
        desarrollo
        entrenamiento
        master
        proyecto_xxx
        qa
      * tarea/1111
    
  2. Cambiarse a la rama con la que se desea mezclar la tarea, esta puede ser la rama del proyecto o rama de desarrollo, qa, proyecto o cualquier otra. Para este ejemplo la rama de desarrollo.
    $ git checkout desarrollo
    
  3. Descargas ultimos cambio de la rama desarrollo
    $ git pull origin desarrollo
    
  4. Realizar la mezcla de la tarea/XXXX con la rama donde estamos posicionados.
    $ git pull origin tarea/XXXX
    
  5. Subir los cambios al repositorio. Para este ejemplo la rama de desarrollo.
    $ git push origin desarrollo
    

Regresando atrás

Hubo algún cambio que se subió alguien y que dejó la escoba... es posible regresar en el tiempo y arreglar todo a través de un agujero de gusano.

  1. Vaya a Suiza al acelerador de partículas
  2. Aplique sus conocimientos de física moderna

o bien

  1. Revise hacia donde quiere regresar obteniendo el HASH deseado
    git log
  2. Si tenemos algún clon del proyecto que haya que retornar
    git checkout HASH
  3. Para volver al ultimo commit guardado en una rama
    git checkout rama

Resolviendo conflictos de merge

Para resolver conflictos en una mezcla que no se ha podido hacer automáticamente (ambos desarrolladores modificaron una misma linea con soluciones distintas) lo que se debe hacer es lo siguiente:

  1. Esto no llevará todo el pull a cavo quejandose de un conflicto en un merge
    git pull origin rama
  2. Edite la salida resolviendo el conflicto
    git mergetool
    git checkout --ours archivo_conflictivo
    git checkout --theirs archivo_conflictivo
  3. Agregue el archivo editado
    git add archivo_conflictivo
  4. Agregue el comentario
    git commit -m "resolviendo conflicto con theirs"
  5. Haga el nuevo PULL sin conflicto
    git pull origin rama
  6. Siga trabajando como siempre

Bibliografía

Se recomienda revisar el siguiente link, donde se encuentra una guía completa de como usar GIT.
[[http://git-scm.com/book/es/]]