Ayuda Git

¿Por qué Utilizar Git?

Dentro de la industria de desarrollo de software es muy común tener un grupo de trabajo trabajando en distintos computadores, o incluso en distintos lugares geográficos, algo habitual principalmente en proyectos de código abierto, por lo que se necesita tener control estricto sobre el código fuente de los proyectos, ya que bajo ese ambiente de trabajo, se pueden dar situaciones como las siguientes:

Ante dichas situaciones, lo más recomendado es utilizar un sistema de manejo de código y control de versiones, ya que estos sistemas cuentan con herramientas adecuadas para abordar tales problemas; y dentro de ese grupo de sistemas, uno de los más destacados y populares es Git.

Instalación de Git

En Linux:

Primero se debe actualizar la lista de paquetes:

$ sudo apt-get update

Luego se procede a instalar git:

$ sudo apt-get install git

Las instrucciones asumen que se tiene instalada una distribución tipo Debian (como Ubuntu o Linux Mint). Dependiendo de cuál sea tu distribución de Linux el manejador de paquetes puede variar. Por ejemplo, en el caso de que se use Arch Linux, se debe cambiar apt-get install por pacman -S

En Windows:

Descarga e instala el programa: http://git-scm.com/download/win

Iniciar Git e Identificación Inicial

En Linux simplemente se debe abrir la consola. En Windows se debe abrir la consola Git que puedes encontrar en Start > All Programs > Git > Git Bash. El resto de operaciones son idénticas entre las versiones de Git de ambos sistemas operativos.

Primero se debe indicar a Git el nombre y correo. Eso se hace con los siguientes comandos (omitir signo $):

$ git config --global user.name "FIRST_NAME LAST_NAME"
$ git config --global user.email "MY_NAME@example.com"

Reemplazar FIRST_NAME y LAST_NAME por el nombre y apellido respectivamente. Reemplazar MY_NAME@example.com por su correo institucional.

Víncular Terminal con GitLab

Para crear un repositorio a traves de GitLab se debe primero configurar una conexión segura con la plataforma. Para eso se debe generar un par de llaves RSA (una llave privada y una llave pública) que asegura que la comunicación con el servidor sea confiable. (Para curiosidades, se pueden encontrar mayores detalles sobre el cifrado RSA aquí).

$ ssh-keygen -t rsa -b 2048 -C "comentario identificador"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): deje en blanco
Enter passphrase (empty for no passphrase): deje en blanco
Enter same passphrase again: deje en blanco
Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
The key's randomart image is:

Luego, en el servidor se debe conocer la llave pública que se encuentra en el archivo .pub generado. (Esta llave corresponde al archivo /home/user/.ssh/id_rsa.pub si se deja todo en blanco).

Una manera de visualizar dicha llave es:

$ cat ~/.ssh/id_rsa.pub
[Copiar todo el resultado entregado en la terminal]

Se debe ingresar a https://gitlab.com/ creando una cuenta con el correo especificado a git en la terminal. Posterior al login se debe ir a la sección de configurar ssh-keys, para llegar a este lugar se debe realizar:

Aqui se procede a insertar la llave generada, además de un nombre para identificarla y una fecha en la que esta expirara

Con este proceso se termina de válidar la conexión entre el terminal Git de su computador y el servidor, permitiendo la creación de repositorios.

Creacion de un repositorio

La creacion de un repositorio en GitLab es tan sencillo como hacer unos click's y configurar algunos parametros estandar

Se selecciona la opcion de creacion de un projecto/repositorio en blanco, lo que nos mostrara la siguiente ventana:

Se selecciona un nombre, una descripcion opcional, y el nivel de visibilidad privado (leer siguiente punto antes de continuar). Se recomienda no inicializar el repositorio con el archivo README, esto permite a GitLab mostrar una serie de comandos a modo de recordar los pasos iniciales.

Privatizar Repositorio [Obligatorio]

Se debe privatizar el repositorio para evitar compartir información con otros grupos, ya sea a propósito o de forma involuntaria. Al momento de crear el repositorio se debe seleccionar la opción para que sea privado. Si ya se creó el repositorio y se quiere hacer privado, se debe ir al Dashboard (Página Principal), elegir el repositorio desde el menú Your Projects, estando en la pagina del proyecto, ir al menú vertical de la derecha entrar a la sección Settings->General, expandir Permissions y allí mismo verificar que Project Visibility se encuentre en Private (Cabe destacar que una vez se haga esto, el repositorio sólo es visible para miembros pertenecientes a este).

Añadir Miembros a Repositorio

Para añadir los integrantes del grupo al repositorio, se debe ir al menu de la izquierda y seleccionar Project Information->Members.

Ahora seleccionar la sección Invite Members. Se desplegará una ventana donde se podrá ingresar el usuario de la persona a añadir y el permiso que tendrá, para esto último se recomienda seleccionar la opción Maintainer.

Para finalizar, dejar en blanco la fecha de expiración de acceso y presionar el botón azul Invite para concluir el proceso.

¡¡Recuerde agregar a los ayudantes de su asignatura a su repositorio!! Los ayudantes deben tener acceso a su repositorio para poder visualizar su código y así proceder a evaluarlo. El no realizar esto podría conllevar a que ¡su tarea no sea evaluada a tiempo!.

Operaciones Comunes al Trabajar con Git

Subir el proyecto al servidor de GitLab

Cuando se termina de crear el repositorio remoto, se mostrara en la web información para configurar el repositorio de forma local.

El flujo de integracion deberia ser el siguiente: Creacion de un proyecto en una terminal -> Subida del proyecto a GitLab -> Bajar el proyecto desde el resto de las terminales del equipo

Creacion de un proyecto en una terminal

Este proyecto puede ser creado de la manera que se estime conveniente. Puede ser un IDE inteligente, se pueden haber creado las carpetas y archivos. Lo unico que importa es que se tenga total control de cual es la carpeta raiz del proyecto.

Subida del proyecto a GitLab

$ cd [carpeta del proyecto]
$ git init
$ git remote add origin git@gitlab.com:[Nombre_usuario_creador]/[Nombre_proyecto].git
$ git add .
$ git commit -m "Initial commit"
$ git push -u origin master

Bajar el proyecto desde el resto de las terminales del equipo

Es importante que se conozca donde se quiere bajar el proyecto, mediante la consola dirigirse a la carpeta donde se quiera descargar y ejecutar:

$ git clone git@gitlab.com:Nombre_usuario_creador/Nombre_proyecto.git
$ cd Nombre_proyecto

Manejo del Flujo de Trabajo desde Repositorio Local a Repositorio en Servidor

Al trabajar en Git, se van dando distintas instancias donde se almacenan los cambios realizados a los archivos, entre ellas el stash, el área de preparación y finalmente el sistema de archivos del repositorio, lo que permite tener un mayor respaldo de la información que se va generando y/o eliminando, además de un mayor control y evitar así cambios irreversibles.

Por lo tanto, al momento de generar cambios en el repositorio local, el primer paso para respaldarlos en el repositorio remoto es mover los cambios realizados al stash, lo que se hace con el comando add.

$git add nombre_archivo

Se puede agregar más de un archivo escribiendo los nombres después del comando, separados con espacios uno del otro.

$git add nombre_archivo1 nombre_archivo2 ... nombre_archivo_n

O bien, también se pueden agregar todos los archivos de la carpeta actual al reemplazar el nombre del archivo por un punto (.).

$git add .

Por el contrario, si se desea eliminar contenido del repositorio local y reflejarlo en el repositorio remoto, se debe usar el comando rm:

$git rm nombre_archivo

Al igual que con el comando add, se puede eliminar más de un archivo a la vez o eliminar todos los archivos de la carpeta en la que se encuentra trabajando, siguiendo las mismas reglas que las mencionada para dicho comando.

$git rm nombre_archivo1 nombre_archivo2 ... nombre_archivo_n
$git rm .

Una vez terminada la preparación del stash, estos cambios deben pasar al área de preparación. Para ello, se hace uso del comando commit. El comando agrupa todos los cambios del stash bajo un índice alfanumérico y posiblemente un comentario descriptivo, cuando se hace uso de la opción -m.

$git commit -m Comentario

Finalmente, para enviar los cambios ya preparados al servidor se debe usar el comando push, el cual detalla a que ubicación remota se van a enviar los cambios, en este caso se deja por defecto origin y a cuál branch de la ubicación remota se aplican los cambios. En este caso, se hace al branch master.

$git push origin master

En resumen el flujo de trabajo de subida al repositorio es: git add [archivos] -> git commit -m "mensaje" -> git push

Actualizar Repositorio Local con Archivos del Proyecto en la Web

Si los integrantes realizan commits mientras no se encuentra trabajando y ninguno de los archivos genera conflictos con los que se encuentran en el repositorio remoto, se puede utilizar el comando pull para descargar los archivos del repositorio remoto y así actualizar el repositorio local.

$git pull

En caso de estar trabajando con múltiples branches, se puede incorporar como parámetros la ubicación del repositorio remoto y la branch de la cual se requieren los archivos. Típicamente en este caso estos parámetros corresponden a origin y master respectivamente.

$git pull origin master

Visualizar Estado Actual del Repositorio

Al iniciar una nueva jornada de trabajo, es muy probable que se desee conocer el estado actual del repositorio. Para ello, puede hacer uso del comando log. Dicho comando muestra una lista de los commits realizados en la branch en la que se encuentran trabajando, desde el más actual hasta el primer commit.

$git log

Por cada commit se muestra el índice que lleva, el autor del commit, la fecha de publicación y el mensaje descriptivo dado por el usuario. Para navegar por el log, utilizar las flechas arriba y abajo, y para salir de la lista de logs, apretar la tecla q.

Si se percata que hay un nuevo commit por parte de uno de algun integrante y se desea saber los cambios efectuados, se puede hacer uso del comando show para ello. Este comando recibe por argumento el índice del commit a visualizar.

$git show indice_del_commit

Se muestra una lista detallada de los cambios realizados, donde se añade un - al comienzo de una fila para indicar que ésta se eliminó y un + para indicar que se agregó la fila que se presenta a continuación. Para navegar por los cambios utilizar las teclas Re Pág y Av Pág y utilizar la tecla q para salir de la descripción.

Si se desea comparar los cambios realizados actualmente que no han sido pasado al stash, con el último commit realizado en la branch de trabajo, se puede hacer uso del comando diff.

$git diff

Finalmente, si se desea comparar los cambios que se encuentran en el stash, con el último commit realizado en la branch de trabajo, puede hacer uso del comando status.

$git status

Se despliega la información de la misma manera que al utilizar el comando show y se utiliza las mismas teclas para navegar por la información y para salir del modo.

Uso de branches

El uso de branches o ramas permite un trabajo más ordenado pues permite trabajar con versiones del proyecto sin afectar la linea de trabajo principal, como por ejemplo una rama que se encargue de crear la grafica, otra rama que se encargue de agregar la base de datos, otra rama que se encargue de agregar funciones, etc. Luego de que una rama termine su trabajo y se encuentre seguro de su funcionamiento, puede funcionar la parte propia con la rama padre, y asi sucesivamente.

Ver ramas existentes

$git branch

Creacion de una rama

$git branch [NombreRama]

Creacion de una rama y movimiento a esta automaticamente

$git checkout -b [NombreRama]

Movimiento a una rama

$git checkout [NombreRama]

Fusionar 2 ramas

$git checkout [NombreRamaQueAceptaLosArchivos]
$git merge [NombreRamaQueEnviaLosArchivos]

Borrar una rama

$git branch -d [NombreRama]

Información Adicional

La información entregada en esta guía corresponde a una pincelada de la capacidad que tienen estas herramientas de Git. Si se desea tener más información sobre los comandos utilizados, o las distintas opciones y modos de operación que se les puede añadir, se puede hacer uso del comando man al anteponerlo a la instrucción Git a análizar, o bien, añadiendo la opción --help a la instrucción.

$man git push
$git pull --help

Si se desea conocer operaciones avanzadas, tales como el manejo de branch, la modificación de commits o el uso de checkout, se recomienda el tutorial Git de tutorialspoint.

Hojas de Resumen

Cheat Sheet con operaciones principales de Git

Documentación Oficial de Git

Guía Introductoria al uso de Branches

Ejemplo Ilustrado del Uso de Git

Si alguno de estos pasos resulta dificil o genera confusión, puede revisar el ejemplo ilustrado de uso de Git