Modernízate, usa git

Publicado en

Git es un sistema de control de versiones distribuido que se ha vuelto muy popular gracias a la red social github, la cual permite publicar código o archivos fuentes de tus proyectos y poder compartirlo con gente de todo el mundo, fomentando la colaboración. Existen otras redes sociales como bitbucket que tienen la ventaja de hacer público o privado el proyecto que publiques. 

Flujo de Trabajo

Git funciona en una gran variedad de sistemas operativos como Linux, Mac OS y Windows. En Linux, si es que no viene preinstalado puedes instalarlo fácilmente desde el package manager. Para Mac OS y Windows lo puedes descargar desde http://git-scm.com. Además, si eres desarrollador, puedes descargar el plug-in para tu IDE favorito, como Eclipse, NetBeans, Sublime Text 2, Xcode, etc.

Git consiste se puede utilizar ya sea desde línea de comando o con un cliente gráfico. Por medio de comandos o iconos se le indica a Git las instrucciones que tiene que realizar.

Existen dos repositorios principales en un proyecto Git, el repositorio local y el remoto. El repositorio local cuenta con tres zonas o árboles, el primero es el directorio de trabajo (working dir) que contiene los archivos del proyecto, el segundo es el índex (stage) que actúa como una zona intermedia que contiene los cambios que se van a confirmar y el HEAD es el que apunta al último commit realizado.

El estado natural del repositorio es el directorio de trabajo. Si hay un cambio en el repositorio, git lo indicará y tiene que ser agregado a la zona index con el comando git add, después de ser agregado se deben de confirmar dichos cambios (commit) con el comando git commit. Una vez confirmados los cambios se agregan a la zona HEAD y el repositorio vuelve de nuevo a la zona natural con los cambios realizados. 

El proceso mencionado anteriormente se debe de realizar por cada cambio en el repositorio. Por cada commit realizado se genera un cambio en el repositorio. Imaginemos una línea recta donde cada cambio es representado por un círculo, está línea contiene todos los registros de cambios, pero además se pueden generar “ramas” (branches) que son líneas alternas que se generan a la par de la línea principal (master). Con esta característica podemos generar un branch para agregar una nueva funcionalidad a nuestro proyecto sin afectar el contenido principal, 

como se muestra en la Figura 1. Una buena práctica es tener dos ramas adicionales, la principal es la rama master (producción), la segunda rama para desarrollo y una tercera para pre-producción.

A continuación enlistan las actividades más comunes al utilizar un sistema de control de versiones, y el comando corresopndiente en git.

 


Figura 1
.
Directorio de trabajo. 

  1. Registrar los cambios del proyecto ($git commit).
  2. Revisar el estado de los cambios del proyecto ($git status).
  3. Visualizar la lista de cambios a través del tiempo del proyecto ($git log).
  4. Regresar a una versión anterior del proyecto ($git checkout).
  5. Deshacer los últimos cambios realizados. ($git reset).
  6. Desarrollar una nueva funcionalidad sin afectar el sistema principal ($git branch).
  7. Mezclar las nuevas funcionalidades con el sistema estable ($git merge). 

Para iniciar con Git, es importante configurar sus variables de entorno, así como configurar la llave para la conexión por SSH. A continuación se muestra los comandos a seguir:

$ git config --global user.name “Laotshi”                # nombre de usuario para el repositorio local
$ git config --global user.email “laotshi@gmail.com” # email del usuario para el repositorio local
$ ssh-keygen                                                    #genera una llave SSH, 

 

Si se usa Github, la llave SSH debe ser agregada en la opción Account settings -> SSH Keys -> Add SSH key.

A continuación se mostrará por medio de un escenario práctico cómo realizar en Git las sietes actividades más comunes mencionadas anteriormente.

Imaginemos que estamos participando en un nuevo proyecto llamado iCV de la empresa TechBuilder, para este proyecto participaran dos desarrolladores Jr y dos desarrollador Sr. 

Se ha decidido utilizar Git como sistema de control de versiones y utilizar la red social GitHub con la finalidad de compartir su proyecto y conseguir colaboradores para la elaboración de su proyecto.

El primer paso del equipo fue abrir una cuenta de GitHub de la empresa y una cuenta por cada uno de los integrantes del equipo.

El segundo paso fue crear un proyecto en GitHub y vincularlo con algún equipo local. Pablo, uno de los desarrolladores, se hizo cargo de esto y para ello realizó lo siguiente:

  1. Crear un repositorio público en GitHub, llamado iCV con su archivo de inicialización README que contiene la descripción. Cuando el repositorio está creado se genera un enlace HTTPS o SSH que permitirá enlazar el proyecto con cualquier equipo local.
  2. En su equipo local desde la línea de comando escribió:

$ mkdir iCV    # crea una carpeta que almacenará el repositorio.
$ cd iCV         # entra a la carpeta
$ git init         # crea un repositorio local. 
$ git remote add origin git@github.com:TechBuilder/iCV.git
                  # Agrega el repositorio remoto al repositorio local

$ git pull origin master  #descarga el contenido del repositorio remoto al repositorio local.

 

Todos los integrantes tuvieron que seguir estos pasos para vincular su repositorio local con el repositorio remoto.

Nota: Todos los cambios realizados dentro de la carpeta iCV serán registrados por Git.

El desarrollador José, creó el archivo index.html y modificó el archivo README.md y quiere agregar dichos cambios al repositorio remoto, para esto, escribió los siguientes comandos:

$ git status  # visualiza los archivos que fueron modificados, agregados o eliminados.
$git add .    # agrega los archivos que tuvieron cambios, para agregar un solo archivo git add nombreArchivo.ext 
$git commit –m “Se agregó la página de bienvenida y se modificó el archivo README”# registra en el repositorio los cambios que se realizaron y coloca un comentario para identificarlo 
$git push origin master # se suben los cambios al repositorio remote en la rama master

Enrique decide visualizar el log (historial) de todos los cambios que se han realizado en el proyecto, con la finalidad de regresar al commit de la semana pasada, por lo cual hace lo siguiente: 

$ git log # visualiza los commit que se han realizado, cada commit tiene un identificador
$ git checkout 0a610 #regresa el proyecto al estado del commit indicado su número HASH.
$ git checkout master #regresa al estado actual del proyecto. 

Mario necesita iniciar su requerimiento sin afectar los cambios que tiene el proyecto, lo que tendrá que hacer es crear un nuevo branch e iniciar a trabajar desde ahí y una vez concluido la funcionalidad tendrá que mezclarla con la rama principal, para realizar esa tarea hizo lo siguiente:

$ git branch desarrollo #crea una nueva rama llamada desarrollo
$ git checkout desarrollo #Coloca la nueva rama como la principal.
$ git add .#agrega los cambios.
$ git commit –m “terminé la funcionalidad” #genera un commit
$git checkout master #se cambia a la rama master
$git marge desarrollo #se mezcla la rama desarrollo con la rama master. 

Enrique hizo unos cambios en sus archivos del proyecto y los agrego al área stage, pero ha decidido no agregar dichos cambios y quiere que el proyecto quede como cuando inicio, por lo que usó los siguientes comandos: 

$ git add . #Agrega todos los archivos que cambiaron al árbol stage 
$ git reset HEAD . #regresa todos los archivos del área stage al área woking dir. 

Al terminar los requerimientos principales del proyecto, los integrantes del equipo tienen un proyecto open source en la nube, donde personas de todo el mundo pueden colaborar con su proyecto, además la colaboración dentro del equipo se ha realizado con éxito.

El uso de Git en la industria del software es esencial, la colaboración entre equipos de trabajo es cada vez más común, por lo tanto es una herramienta que no debe de falta en nuestros proyectos de software.