## Ayuda Git

- ¿Por qué Utilizar Git?
- Instalación de Git
- Iniciar Git y Configuración Inicial
- Víncular Terminal con Servidor de Repositorios de Electrónica
- Creación de Nuevo Repositorio Remoto
- Privatizar Repositorio [Obligatorio]
- Añadir Miembros a Repositorio
- Operaciones Comunes al Trabajar con Git

- Inicializar el Repositorio de Forma Local
- Crear Repositorio local y Vincularlo a un Proyecto del Servidor Web
- Manejo del Flujo de Trabajo desde Repositorio Local a Repositorio en Servidor
- Visualizar Estado Actual del Repositorio
- Actualizar Repositorio Local con Archivos del Proyecto en la Web

- 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:

$ 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 debes abrir la consola. En Windows debes 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 debes indicarle 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"

### Víncular Terminal con Servidor de Repositorios de Electrónica

Todo alumno del ramo posee un usuario y contraseña en los servidores Git de electrónica. Cada alumno debe tener en su poder, en su correo institucional, las credenciales para entrar al sitio. Lo primero que se necesita para manejar los repositorios es crear una contraseña de usuario, para lo cual se proporciona en el mismo correo un link que permite hacerlo.

Para crear un repositorio se debe primero configurar una conexión segura con el servidor de electrónica. 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 -C "correo_institucional"
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]

Entrar al servidor de electrónica, logearse e ir a Settings en la parte superior derecha de tu Dashboard, luego seleccionar SSH Keys en el menú desplegado en la parte izquierda. En la sección de Add an SSH key, en la parte de Key se debe pegar el contenido de la llave pública generada, el resultado de dicho comando cat, y en la parte de Title agregar un nombre a la conexión, luego apretar el botón verde Add Key. 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 nuevos repositorios.

Para final, será necesario que proporcione información a su terminal para que pueda identificar y válidar la conexión establecida. Para realizar ello, ejecutar el comando:

$ ssh -T git@git.elo.utfsm.cl

Si el resultado del comando es algo similar a Welcome to GitLab, nombre_usuario!, significa que la conexión opera correctamente (La primera vez le pedirá confirma la conexión).

### Creación de Nuevo Repositorio Remoto

En la plataforma web de electrónica, en el inicio, elegir la opción "New project" y llenar la información que se requiere.

### 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, 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.

### Añadir Miembros a Repositorio

Para añadir los integrantes de su grupo al repositorio, seguir los mismos pasos para llegar al menú Settings (Dashboard/Projects->Your Projects->Project_to_manage->Settings).

Ahora seleccionar la sección 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 Master.

Para finalizar, dejar en blanco la fecha de expiración de acceso y presionar el botón verde Add to project 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

#### Inicializar el Repositorio de Forma Local

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

Dicha información se puede resumir en lo siguiente: ir a la carpeta padre de la carpeta donde contendrá el proyecto, clonar su proyecto vacío desde el servidor hacia su computador, generar un archivo README, prepararlo para su subida y finalmente subirlo al servidor.

$ git clone git@git.elo.utfsm.cl:Nombre_usuario_creador/Nombre_proyecto.git
$ cd Nombre_proyecto
$ touch README.md
$ git add README.md
$ git commit -m "add README"
$ git push -u origin master

Este proceso sólo lo debe realizar la primera persona que interactue con el repositorio remoto, los demás integrantes del grupo basta con que clonen el proyecto para poder comenzar a trabajar.

$ git clone git@git.elo.utfsm.cl:Nombre_usuario_creador/Nombre_proyecto.git
$ cd Nombre_proyecto

#### Crear Repositorio local y Vincularlo a un Proyecto del Servidor Web

Para crear un repositorio localmente, debes ir al directorio donde vas a trabajar y almacenar el proyecto, inicializar una instancia de git y vincularla con el proyecto del repositorio remoto.

$cd carpeta_de_la_tarea
$git init
$git remote add origin git@git.elo.utfsm.cl:nombre_usuario_creador/nombre_proyecto.git

#### 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

#### 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.

#### 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

### 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

### Interfaz gráfica

Existen alternativas para hacer manejo de git a travéz de una interfaz gráfica. Para efectos de este ramo es preferible no usar una para comprender mejor los conceptos de git, sin embargo, si usted lo desea puede usar uno de su comodidad.