Git & Github

¿Qué es git?

GIT es un sistema de control de versiones distribuido ampliamente utilizado en el desarrollo de software. GIT se emplea para rastrear cambios en el código fuente a lo largo del tiempo y para colaborar en proyectos de software. .

Gracias a que se van guardando todos los cambios de los ficheros, podemos restaurar versiones antiguas del proyecto, comparar, analizar y fusionar los cambios. A este proceso se le conoce como control de versiones (Version control) y es ampliamente usado en los equipos de ingeniería de software.

En esta pequeña introducción veremos los comandos más comunes y básicos que nos permetirán integrar nuestro trabajo con el del resto del equipo y, a partir de aquí, construir un conocimiento más sólido a medida que vamos avanzando.

¿Qué es Github?

Hemos comentado que GIT es un sistema que nos permite hacer un control de versiones de nuestro codigo/proyecto. Git es un sistema descentralizado y utiliza nuestro propio disco duro para crear un repositorio. Sobre git existen varios servicios web que permiten guardar una copia en la nube de nuestro propio repositorio. Aunque existen otros, el más utilizado por el común de los mortales de forma pública es github.

Antes de continuar, debemos tener una cuenta activa o crearnos una en este momento.

Tutorial

Configurar git

Para configurar git por primera vez abre una terminal y escribe:

git config --global user.name "My Name"
git config --global user.email myEmail@example.com

Nota

Podemos configurar un repositorio individual para utilizar un usuario/dirección de correo electrónico específico que anula la configuración global. Desde la raíz (la carpeta) del repositorio, ejecutaremos:

git config user.name "Your Name Here"
git config user.email your@email.com

Crear un repositorio local

Para crear un nuevo repositorio, creamos una carpeta nueva en la que situaremos nuestro proyecto y nos situaremos en ella.

mkdir test_repo
cd test_repo

Una vez dentro de la carpeta, crearemos un fichero de texto simple. Es buena practica que el primer fichero sea un “README.md”. Este fichero lo usaremos para ir actualizando la información de nuestro proyecto. Podemos crearlo desde el programa que más nos guste, aunque desde la terminal se puede generar uno de manera sencilla simplemente escribiendo:

echo "# This is a title." >> README.md

Una vez creado el fichero inicializaremos el repositorio usando el comando:

git init
Initialized empty Git repository in /test_repo/.git/

Como podéis ver, aunque tengamos el fichero “README.md” en la carpeta, nos dice que el repositorio está vacio. De hecho si ejecutamos:

git status

Nos devuelve el siguiente mensaje:

On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        README.md

nothing added to commit but untracked files present (use "git add" to track)

Esto se debe a que somos nosotros los que debemos indicarle que ficheros tiene que empezar a seguir y hasta que no lo hagamos los cambios que vayamos realizando al fichero no se guardaran. Fijate en que git ya nos da una pista de como seguir…al usar el comando git add FICHERO estamos haciendo que el fichero pase al area de ensayo o, en argot git, “staging area”.

git add README.md

Vuelve a ejecutar git status y veras que ahora el mensaje ha cambiado. De hecho nos dice algo como:

On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   README.md

Este nuevo mensaje nos dice que el fichero esta listo para ser “committed”. Un “commit” es una copia de nuestro fichero en un momento dado del tiempo que podremos recuperar siempre que queramos. Para crear un “commit nuevo” necesitamos que al menos un fichero este modificado en el area de “stage”.

Para hacerlo, simplemente tenemos que ejecutar:

git commit -m "Este es el primer commit. Añade el fichero README.md"

Para ver la lista de commits, ejecuta:

git log

Sincronizar el repositorio local con Github

Una vez creado el repositorio en local, podemos sincronizarlo con uno en nuestro “hub” de elección.

Para poder enviar nuestro “repo” al hub, primero debemos crear un proyecto nuevo. Ves a github, entra con tu usuario y contraseña y crea un proyecto nuevo.

Una vez creado, obtendremos una url tal que:

Con esta url podemos decirle a nuestro repositorio local que apunte a este repositorio remoto con el comando:

git remote add origin https://github.com/nombreusuario/nombre_repo.git

Donde origin es el nombre del repositorio remoto principal.

Sobre el repositorio, creamos una rama:

git branch -M main

Finalmente, podemos publicar nuestros cambios en el repositorio remoto. Es buena practica indicar el nombre del repositorio y a la rama que queremos enviarlo mediante:

git push origin main

Sincronizar los repositorios

Si trabajamos en paralelo con otras personas, es posible que a la hora de querer publicar un cambio que hayamos hecho pisemos el trabajo de otra persona. Es obligatorio actualizar nuestro repositorio local con el remoto antes de hacer un “push” con nuestros cambios a fin de evitar pisar los cambios que haya hecho otra persona. Esto puede generarnos “conflictos” que tendremos que solucionar en nuestro local a fin de integrar nuestros cambios con los de los demás. Una vez solucionados los conflictos, podremos hacer “push” tranquilaente.

Finalmente, el workflow típico de git una vez hayamos modificado algún fichero se puede resumir en:

git add FICHEROS  # añadir a la fase de "stage" los ficheros modificados
git commit -m "Pequeña descripción de los cambios" # Crear un commit para los cambios
git pull origin main # actualizar desde el repositorio origin y la rama master del servidor
git push origin main # publicar al repositorio origin y la rama master del servidor una vez solucionados los conflictos

Ramas

Si queremos crear lineas independientes de desarrollo para poder trabajar en paralelo debemos usar ramas. Esto nos permite crear nuevas funcionalidades o modificar las existentes sin interferir en la rama “master o main”.

Para crear una nueva rama desde el una existente (normalmente master o main) ejecutamos:

git checkout -b newBranch main

Comprobamos que estamos en la rama “newBranch” con el comando:

git branch

A partir de aquí todas las modificaciones que hagamos se harán sobre la rama “newBranch”. Vamos a insertar un nuevo fichero y guardarlo en la fase de stage haciendo “commit”

echo "# Hello" >> NewReadme.md
git add NewReadme.md
git commit -m "Nuevo Readme añadido en la rama newBranch"

Al terminar hacemos push para subir los cambios al servidor remoto. Especial atención a la sintaxis, donde se especifica el nombre de la rama ‘newBranch’ en vez de ‘master’

git push origin newBranch

Antes de continuar, si listamos los ficheros haciendo ls en la terminal vemos que nos aparecen los dos ficheros.

Ahora, si queremos integrar los cambios de la rama auxiliar a la principal, debemos situarnos en la rama ‘master’ otra vez. Para ello ejecutamos:

git checkout main

Y comprobamos que estamos sobre la rama “master” usango otra vez:

git branch

Pregunta: Que pasa si listamos los ficheros otra vez? Notas algo raro? En efecto, al pasar otra vez a la rama ‘master’ el fichero nuevo no aparece en el listado. Esto es debido a que sigue en la rama “newBranch”, que es independiente de la de “master”. Para fusionar las dos ramas usamos el comando:

git merge newBranch

Que nos fusionará la rama newBranch a la rama en la que nos encontramos, en este caso ‘master’.

Finalmente si queremos eliminar la rama ‘newBranch’, ejecutamos:

git branch -d newBranch

Ventajas de github

Clone

Git permite clonar una copia de un repositorio ajeno en nuestro entorno local para poder experimentar con el proyecto. Sin embargo, no podremos hacer “push” sobre el proyecto, ya que no es nuestro.

En caso de que queramos cambiar el repositorio original por el que hayamos creado en nuestro Github y ejecutar el siguiente comando.

git remote set-url origin https://github.com/nombreusuario/nuevo_repo.git

Fork

Hacer “fork” sobre un repositorio crea una copia del trabajo de una tercera persona/equipo en nuestro servidor y permite experimentar con el codigo ajeno de forma completamente libre sin afectar al proyecto original. Permite poder proponer mejoras a un proyecto existente o usar ese proyecto como punto de partida para tu propia idea. Despues de hacer un “fork” podemos clonar el repositorio desde la url con nuestro nombre de usuario.

Si hacemos una contribución a algún proyecto y queremos que los creadores originales la tengan en cuenta y nos reconozcan como contribuyentes al proyecto, podemos enviar un “pull request” que sera aceptada o no para que forme parte del proyecto original.

Fork example

Recapitulando

En está primera sesión hemos visto:

  1. Que es el control de versiones y que son los repositorios git locales y remotos (github, …).

  2. Como crear un repositorio local y tratar los archivos de forma que se haga un seguimiento de los cambios con una conexión al servidor remoto

  3. Como crear ramas para modificar los archivos y luego fusionarlos a la rama principal de trabajo

Utils:

Git Cheatsheet

Tutorial online - Atlassian (bitbucket)

Tutorial online - Atlassian (bitbucket)