Objetivo

El objetivo de esta tarea familiarizarse con el uso de Git y GitHub para el control de versiones en un proyecto de Java. Aprenderás a crear y gestionar un repositorio local, realizar commits, utilizar ramas, y llevar a cabo operaciones de fusión y resolución de conflictos.

Control de versiones con Git

  1. Instalación de Git en el ordenador

    Instala Git a través de la terminal:

    sudo apt install git
    

    Configura tu nombre de usuario y correo electrónico para Git, utiliza el mismo que para tu cuenta de GitHub:

    git config --global user.name "Tu Nombre"
    git config --global user.email "[email protected]"
    
  2. Creación de un repositorio local

    Crea un directorio llamado ProyectoJava y abre una terminal en dicha carpeta.

    Inicializa un nuevo repositorio de Git en este directorio:

    git init
    

    Cambia el nombre de la rama principal a “main”:

    git branch -m main
    

    Verifica que el repositorio ha sido creado correctamente

    git status
    
  3. Desarrollo de un proyecto en Java

    Crea un archivo llamado HolaMundo.java.

    Escribe un programa básico en Java que muestre por pantalla el mensaje "Hola mundo" y guárdalo en HolaMundo.java:

    public class HolaMundo {
        public static void main(String[] args) {
            System.out.println("Hola mundo");
        }
    }
    
  4. Ejecución del primer commit

    Si ejecutamos otra vez git status, veremos el fichero HolaMundo.java no se encuentra en seguimiento, es decir, no se tendrá en cuenta para el control de versiones.

    Añade el archivo HolaMundo.java al área de preparación (stagin area) para controlar sus versiones:

    git add HolaMundo.java
    

    Realiza un commit para guardar este cambio en el historial del repositorio:

    git commit -m "Comienza el proyecto"
    
  5. Seguimiento de los commits

    Observa el historial de commits:

    git log
    

    Vamos a crear un comando que nos permita observar los commits con más información.

    Dentro de la carpeta oculta .git que se ha creado en el directorio del proyecto, abre el fichero config e inlcuye lo siguiente:

    [alias]
            tree = log --oneline --graph --decorate --all
    

    Ahora puedes ejecutar el comando git tree, el cual se ha definido como un alias que en realidad ejecuta git log con todas las opciones descritas arriba:

    git tree
    

    Este comando nos indica que existe un commit (con el símbolo *), y que nuestro proyecto está como cuando hicimos el commit (con la palabra HEAD). Además, ese es el último commit de la rama main.

    Ahora mismo nos encontramos aquí, siendo la flecha el HEAD y el círculo el commit:

    imagen.png

  6. Creación y configuración del archivo .gitignore

    Sitúate en la carpeta del proyecto y comila el programa HolaMundo.java para crear el fichero HolaMundo.class:

    javac HolaMundo.java
    

    Ejecuta git status. Verás que indica que el fichero HolaMundo.class no se encuentra en seguimiento. No interesa controlar las versiones de este tipo de archivos, pues siempre se pueden compilar a raíz del codigo fuente, que es el que sí nos interesa controlar con git. Por lo tanto, vamos a indicarle a git que ignore cualquier fichero CLASS del proyecto.

    Crea un archivo .gitignore en la carpeta del proyecto y escribe lo siguiente:

    # Ignorar los archivos de compilación
    *.class
    

    Si ejecutas de nuevo un git status, podrás ver que el propio fichero .gitignore no está en seguimiento. Por si moficiamos este fichero más adelante, sí es interesante controlar su versión, por lo que vamos a añadir toda la carpeta del proyecto y guardaremos un commit (aunque añadamos toda la carpeta al seguimiento, ignorará el fichero CLASS).

    git add .
    git commit -m "Añade archivo .gitignore"
    

    Nos encontramos aquí:

    imagen.png

  7. Modificación del proyecto y volver a un commit anterior

    Modifica el programa HolaMundo.java para que muestre por pantalla un mensaje con tu nombre:

    public class HolaMundo {
        public static void main(String[] args) {
            System.out.println("Hola mundo");
            System.out.println("Eres tuNombre");
        }
    }
    

    Realiza un commit para guardar el cambio:

    git add .
    git commit -m "Añado un mensaje con mi nombre"
    

    Comprueba los commits realizados y fíjate en los identificadores de cada commit:

    git tree
    

    Ahora estamos aquí:

    imagen.png

    Regresa al commit anterior utilizando su identificador:

    git switch idDelCommitAnterior
    

    Comprueba el fichero HolaMundo.java para descubrir si se han deshecho los cambios.

    Vuelve a comprobar el log de commits con git tree y observa dónde te encuentras. Ahora nos situaríamos aquí:

    imagen.png

    Si hiciéramos otro commit ahora, se crearía automáticamente en otra rama nueva para no perder el último commit realizado, pero vamos a crear una rama manualmente.

  8. Crear una nueva rama para añadir una nueva funcionalidad

    Vamos a crear una rama nueva que simule que vamos a añadir una nueva funcionalidad pero queremos hacerlo en un espacio aparte para no afectar a la rama principal.

    Crea una rama nueva llamada feature-suma:

    git branch feature-suma
    

    Muévete a la nueva rama:

    git switch feature-suma
    

    Modifica el archivo HolaMundo.java para que realice la suma de dos números enteros e imprima el resultado, observa cómo no está el comando que muestra tu nombre porque estábamos situados en un commit donde no lo habíamos añadido:

    public class HolaMundo {
        public static void main(String[] args) {
    		    int num1 = 5, num2 = 3;
            System.out.println("Hola mundo");
            System.out.println("La suma de los números es " + (num1+num2));
        }
    }
    

    Añade la carpeta del proyecto y realiza un commit de los cambios:

    git add .
    git commit -m "Añade la suma de dos números"
    
    

    Ejecuta un git-tree y observa como se visualiza la rama main marcando su último commit, y la nueva rama en la que nos situamos ahora mismo. Estamos aquí:

    image.png

  9. Fusionar la rama feature-suma con la rama principal

    Una vez terminada de implementar la nueva característica, podemos fusionar las ramas para continuar por un único camino.

    Cambia a la rama principal, esto nos moverá al último commit de la rama main, es decir, aquel que mostraba tu nombre:

    git switch main
    

    Fusiona los cambios de feature-suma en main:

    git merge feature-suma
    

    Git nos avisará de que existe un conflicto entre las ramas, pues en una rama teníamos una línea que mostraba tu nombre y la rama feature-suma la creamos cuando esto no estaba aún implementado.

    Corrige los conflictos abriendo el fichero HolaMundo.java y decidiendo cómo quieres la versión final del programa. Podemos dejarla así:

    public class HolaMundo {
        public static void main(String[] args) {
    		    int num1 = 5, num2 = 3;
            System.out.println("Hola mundo");
            System.out.println("La suma de los números es " + (num1+num2);
        }
    }
    

    Haz un nuevo commit confirmando los cambios:

    git add .
    git commit -m "Fusión de las ramas"
    

    Ejecuta un git tree para visualizar esta fusión. Ahora volvemos a trabajar sobre la rama principal con los cambios introducidos en la rama feature-suma. Nuestro Git se vería así:

    image.png

  10. Ejercicio: fusionar rama sin conflicto

    Vamos a crear una rama nueva en la que los cambios sean simplemente que se añade un segundo fichero al proyecto, así evitaremos que surjan conflictos con la rama principal. Realiza por tu cuenta estos pasos:

Conexión con GitHub

Todo el control de versiones de nuestro proyecto está sucediendo a nivel local. Si queremos mantener copias en la nube, o queremos trabajar de forma colaborativa, una solución idónea es utilizar GitHub.

GitHub es una red social donde puedes almacenar y compartir tus repositorios. Además, funciona muy bien con git, pues a través de la consola podemos sincronizar nuestros cambios con nuestro repositorio en la nube.

  1. Creación de una cuenta de GitHub
  2. Generación de una clave SSH
  3. Sincronizar repositorio local con el repositorio en GitHub

Para profundizar