## Ayuda Git

- ¿Por qué Utilizar Git?
- Instalación de Git
- Iniciar Git y Configuración Inicial
- Víncular Terminal con GitLab
- Creacion de un repositorio
- Privatizar Repositorio [Obligatorio]
- Añadir Miembros a Repositorio
- Operaciones Comunes al Trabajar con Git
- Información Adicional
- Hojas de Resumen
- Ejemplo Ilustrado del Uso de 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:

- Algún desarrollador hace un aporte, y necesita que el resto del grupo decida si este aporte es significativo y debe convertirse en parte del código definitivo para el programa.
- Alguien modifica una parte sensible del código, haciendo que el resto no funcione, se necesita poder volver a un estado funcional anterior.
- Generar comentarios fuera del código fuente del proyecto, que indica qué modificaciones necesita cada archivo (un TODO: to-do, "por hacer").
- Algun integrante no-desarrollador requiera obtener la última versión del código fuente para compilarlo y usarlo en su propio computador, para colaborar en el testeo del programa.

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 tienes 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 uses Arch Linux, debes 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 tu 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 su 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 debe generarse un par de llaves RSA (una llave privada y una llave pública) que asegurará que la comunicación con el servidor será 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 debe conocer tu llave pública que se encuentra en el archivo .pub generado. (Esta llave corresponde al archivo /home/user/.ssh/id_rsa.pub si dejaste todo en blanco).

Una manera de visualizar dicha llave es:

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

Ingresamos a https://gitlab.com/ creando una cuenta con el correo especificado a git en la terminal. Posterior al login debemos irnos a la seccion de configurar ssh-keys, para llegar a este lugar debemos realizar:

Aqui procederemos a insertar nuetra llave generada, ademas 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

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

Seleccionamos 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 le permitiria a GitLab mostrarle una serie de comandos a modo de recordarle los pasos iniciales.

### Privatizar Repositorio [Obligatorio]

Usted debe privatizar su 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 creó el repositorio y lo quiere hacer privado, usted debe ir al Dashboard (Página Principal), elegir su 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 haga esto, el repositorio solo sera visible para miembros pertenecientes a este).

### Añadir Miembros a Repositorio

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

Ahora seleccionar la sección Invite Members. Se desplegará una ventana donde 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 estimen conveniente. Puede ser un IDE inteligente, pueden ustedes haber creado las carpetas y archivos. Lo unico que importa es que tengan 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 sepan donde quieren bajar el proyecto, mediante la consola diriganse a la carpeta donde quieran descargarlo y ejecuten:

$ 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 sus 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 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 pueden 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 vamos a enviar los cambios, en este caso dejamos por defecto origin y a cuál branch de la ubicación remota se aplicarán los cambios. En este caso, lo haremos 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 sus compañeros realizaron commits mientras usted no trabajaba y ninguno de sus archivos genera conflictos con los que se encuentran en el repositorio remoto, puede utilizar el comando pull para descargar los archivos del repositorio remoto y así actualizar su repositorio local.

$git pull

En caso de estar trabajando con múltiples branches, se pueden incorporar como parámetros la ubicación del repositorio remoto y la branch de la cual se requieren los archivos. Típicamente en nuestro caso estos parámetros corresponderán 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 usted desee conocer el estado actual del repositorio. Para ello, puede hacer uso del comando log. Dicho comando mostrará 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 se realizó un nuevo commit por parte de uno de sus compañeros y desea saber los cambios efectuados, 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 mostrara una lista detallada de los cambios realizados, donde se añadirá 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 desea comparar los cambios realizados actualmente que no han sido pasado al stash, con el último commit realizado en la branch de trabajo, puede hacer uso del comando diff.

$git diff

Finalmente, si 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 utilizan las mismas teclas para navegar por la información y para salir del modo.

#### Uso de branches

El uso de branches o ramas permitira un trabajo más ordenado pues permitira 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 su parte 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 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, pueden 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 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 le pareció dificil o generó confusión, puede revisar el ejemplo ilustrado de uso de Git