A lo largo de este curso de git aprenderemos cosas como ¿que son los hooks? ¿que son ramas? ¿como fusionarlas? etc.
Git es un sistema de control de versiones creado por Linus Torvalds. Un sistema de control de versiones registra los cambios realizados en un archivo o conjunto de archivos.
Para explicarlo mejor imagina que tenemos un proyecto y en este proyecto tenemos muchos archivos, todos sus archivos en algún punto se van a convertir en nuestra versión inicial o versión 1 de nuestro proyecto. Después vamos a tener una versión 2 y conforme pasa el tiempo vamos a ir teniendo diferentes versiones.
Git lo que hace es monitorear todo lo que hacemos en nuestro proyecto ya se añadir, cambiar o eliminar líneas de código. Una de las ventajas que tenemos cuando usamos git es que podemos cambiar de versión de una forma muy sencilla y directa. Supongamos que tenemos un error en la versión 3 pero en la versión 2 no lo teníamos, entonces podemos ir a la versión 2 y buscar cuál fue el error que causa que no funcionen las cosas bien en la versión 3.
En git tenemos tres estados:
Entonces recapitulando nuestro flujo de trabajo va a ser:
La instalación de git es muy sencilla y está tanto para windows para linux y como para mac.
Nos dirigimos a la página oficial de git y seleccionamos nuestro sistema operativo. Para windows y mac es una instalación típica, siguiente siguiente siguiente. En windows vamos a tener un extra y es que la instalación de git instala un terminal donde vamos a poder ejecutar comandos de git y olvidarnos del cmd de windows.
La instalación de linux es a través de la terminal y el gestor de paquetes. Simplemente ejecutamos el comando, que la página oficial de git nos facilita, en función de la distribución que uses y listo.
El siguiente paso es hacer unas configuraciones básicas, para ello vamos a abrir la terminal y en el caso de windows vamos a abrir la nueva consola que nos instaló el paquete de git.
Lo primero es configurar nuestro nombre. Para ello solo tenemos que ejecutar:
git config --global user.name "aqui tu nombre"
Lo siguiente es configurar nuestro email. Igual que antes ejecutamos el siguiente comando:
git config --global user.email "aquí tu email"
Si queremos ver la configuración siempre podremos ejecutar:
git config --global user.name
git config --global user.email
También tenemos la opción de configurar los colores pero, esto es opcional aunque te lo recomiendo mucho porque siempre nos va a arrojar diferentes resultados, diferentes mensajes dependiendo de lo que estemos haciendo. Con esta configuración le decimos a git que los pinte de distintos colores esos resultados así distinguimos mejor que lo que nos está diciendo git. Para ellos solo ejecutamos el siguiente comando:
git config --global color.ui true
Ahora ya tenemos configurado los colores.
Si queremos ver toda nuestras configuraciones globales podemos ejecutar el comando:
git config --global --list
y esto nos va a dar un listado de nuestras configuraciones de lo que acabamos de hacer.
Al fin vamos a empezar nuestro primer proyecto git. Para ello tengo una página bastante sencilla pero, con la que iremos trabajando y aprendiendo todos los comandos de git.
Primero no vamos a la terminal, nos movemos al directorio de nuestro proyecto y ejecutamos el primer comando de git:
git init
Con este comando le indicamos a git que inicialice un repositorio nuevo. A partir de ahora git va a empezar a llevar el seguimiento de todo lo que ocurre dentro de nuestro proyecto, da igual si añadimos, borramos o actualizamos un fichero, git se enterará.
Este comando solo se utiliza una vez en cada inicialización.
Para saber el estado que se encuentra nuestro proyecto ejecutamos:
git status
Como vemos nos muestra un listado de archivos pero, git nos esta indicado que aun no han sido añadido al repositorio.
Como vimos en el punto anterior teníamos archivos y directorios que aun no teníamos añadidos en nuestro repositorio. Para añadir un archivo en el repositorio simplemente ejecutamos:
git add index.php
Ahora si volvemos a ejecutar:
git status
Nos muestra el mismo listado pero ya tenemos nuestro index.php añadido en el repositorio.
Tal vez en tu proyecto tengas muchos fichero y añadir uno a uno puede ser un poco coñazo. Para evitar eso git tiene un comando para añadir todo de golpe:
git add -A
ó
git add --all
Vale ya tenemos archivos añadidos en nuestro repositorio de git pero, ¿para que hacemos esto? Bueno aquí empieza una de las partes más importante de tener un repositorio git y es poder commitear el estado actual de nuestro repositorio. Para hacerlo están sencillo como ejecutar:
git commit -m "esto es un mensaje"
Esto lo que hará es hacer una foto del estado actual de nuestro repositorio. El mensaje es muy importante y tiene que ser lo más descriptivo posible.
Ahora si de nuevo ejecutamos:
git status
Como puedes ver ya no tenemos nada.
Vamos a repetir el proceso pero, para ello vamos a modificar un fichero y vamos a volver a ejecutar:
git status
Como puedes ver git nos esta indicado que se ha modificado el fichero. En esta ocasión aparece en verde y no en rojo ¿por que? Porque ya agregamos anteriormente el fichero a nuestro repositorio y simplemente lo hemos modificado. Si añado uno nuevo y ejecuto:
git status
Como ves ahora si me dice que tengo un fichero no añadido.
Ejecutamos:
git add -A
Esto lo que hará es añadirme el nuevo fichero y ya solo queda hacer la foto estatica para que git se la guarde. Para ello ejecutamos:
git commit -m "Nuevo fichero y modificado el anterior"
Con eso nuestro repositorio esta limpio y ya podemos continuar.
Este comando de git es muy interesante si queremos ver el historia de nuestros commits. Si ejecutamos:
git log
esta es la info que nos devuelve:
Pero, ¿qué significa esto?
Al principio del post comenté que con git podríamos ir de una versión a otra de nuestro proyecto, eso significa que podemos movernos entre commit con total libertad. No solo podemos movernos entre commit si no entre ramas y entre tags. Las ramas y los tags los veremos un poco más adelante.
¿Recuerdas el identificador del commit que nos daba git logs? pues vamos a usarlo para movernos entre los commits. Para ello ejecutamos:
git checkout <identificador-commit>
Si verificamos nuestro código podremos ver que estamos en una versión anterior a la que estábamos. Si ejecutamos:
git log
nuestro último commit ha desaparecido. Bueno realmente no ha desaparecido simplemente que en el punto donde estamos ese commit aun no ha ocurrido. Para regresar al punto donde estabamos ejecutamos:
git checkout master
Si nos fijamos ya ha vuelto nuestro código a su estado final.
En git tenemos algo muy útil pero al mismo tiempo muy peligroso si no se usa bien.
Imaginate que has estado programando una nueva funcionalidad y después de hacer commit te das cuenta de que tiene errores y quieres deshacer el commit. Bueno pues aquí entra la magia de git reset. Este comando tiene tres formas de ejecutarlo y vamos a verlos uno a uno.
Primero vamos a ver el estado actual de nuestro repositorio con:
git log
Imaginemos que el commit f41fb613902f9b7cc47f1fdb23de392d6238a57a queremos deshacerlo, pues ejecutamos:
git reset --soft 48cb8d5c37c0298b0ddb9a037996d8df27ac931f
Si te fijas he cogido el commit anterior al que quiero deshacer.
Si ahora ejecutamos:
git log
veras que ahora solo tenemos un commit y si ejecutamos:
git status
tenemos todos los cambios que se hicieron en el commit que hemos desecho.
Igual que hemos hecho antes, primero vamos a ver el estado de nuestro repositorio con un:
git log
Igual que antes vamos a deshacer el último commit pero esta vez con mixed para que podamos ver la diferencia. Para ello ejecutamos:
git reset --mixed 48cb8d5c37c0298b0ddb9a037996d8df27ac931f
Si verificamos los logs:
git log
podemos ver que el resultado es el mismo que con soft pero, si ejecutamos:
git status
aquí es donde vemos cambios. La diferencia entre git reset soft y git reset mixed es que mixed saca los ficheros nuevos, que tuviese ese commit, fuera de nuestro repositorio, es como si deshiciese el git add.
Esta es la opción más dura y que más cuidado tenemos que tener de git reset. Para no perder la costumbre vamos a ver el estado del repositorio con:
git log
Ahora vamos a ejecutar:
git reset --hard 48cb8d5c37c0298b0ddb9a037996d8df27ac931f
Si miramos nuestros logs:
git log
Podemos comprobar que ha deshecho el commit perfectamente pero, si verfificamos el status:
git status
esta totalmente limpio. Eso significa que git ha deshecho el commit pero, ha borrado todos los cambios que tenia el commit.
Hay que tener mucho cuidado con este reset porque podríamos borrar cosas por accidente.
Bueno ahora te presento un comando que no ayuda a orientarnos un poco en las diferentes opciones que tiene git. Es una pequeña documentación que nos viene muy bien cuando no recordamos algún comando. Para que nos muestre la ayuda simplemente ejecutamos:
git help
y nos muestra la ayuda.