Aprende Git desde las Bases hasta las Ramas
Has de Git una herramienta fundamental en tu día a día como desarrollador
Trabajando en el desarrollo de software muchas veces he tenido la sensación de que modifico cualquier parte del código de una aplicación, esta dejará de funcionar y yo terminaré intentando resolver miles de errores. Y seguramente esta sensación no es mía únicamente, seguro tu también la has sentido.
Es por esto que existen herramientas como Git, el cual es un sistema de control de versiones que puede funcionar como una máquina del tiempo para volver al momento exacto en que todo funcionaba. Así que continua leyendo para dominar esta herramienta que es parte fundamental del día a día de cualquier desarrollador.
Qué es Git
Git es un sistema de control de versiones distribuido, el cual está diseñado parea manejar desde proyectos pequeños hasta proyectos grandes con velocidad y eficiencia. Fue creado por Linus Torvalds en el 2005 para el desarrollo del Kernel de Linux.
En Git, cada desarrollador trabaja en una copia completa del repositorio, lo que cual incluye todo el historial de cambios. Esto permite la gestión autónoma del código y también facilita la colaboración.
Actualmente Git es esencial en el desarrollo de software por:
Permitir a los desarrolladores mantener un historial completo de cambios, lo cual facilita revertir a versiones anteriores si algo sale mal.
Simplificar la colaboración entre múltiples desarrolladores, permitiendo que varias personas trabajen en el mismo proyecto de forma simultanea sin interferir entre sí.
Rastrear los cambios a través de commits, los cuales incluyen la información sobre el autor y la fecha, mejorando la responsabilidad y la comprensión de la evolución del proyecto.
Usar ramas, las cuales le permiten a los desarrolladores trabajar en características o arreglos sin afectar el código de principal o de producción, fomentando la experimentación e innovación.
Diferencia entre Git y Control de Versiones Centralizados
Los sistemas de control de versiones centralizados (como CVS o Subversion) se basaban en un modelo centralizado donde todo el historial de versiones se almacenaba en un servidor centrar, a diferencia de en Git, que es distribuido.
Git, al ser distribuido cada usuario tiene una copia completa del repositorio, incluyendo todo el historial de cambios. En sistemas centralizados, los usuarios solo tienen una copia de la versión actual de los archivos. Por otro lado, cuando se tiene un sistema centralizado, si el servidor llega a fallar nadie puede colaborar o guardar una nueva versión hasta que se restaure. Con Git esto no pasa, ya que como cada usuario tiene un respaldo completo, se puede seguir trabajando incluso sin acceso al servidor central.
A continuación te dejo una tabla que resume las diferencias clave entre Git y los sistemas de control de versiones centralizados, destacando las ventajas y desventajas de cada uno en los distintos aspectos clave del desarrollo de software.
Instalación y Configuración Inicial
La instalación de Git varia según el sistema operativo en el que va a utilizar. A continuación te dejo un resumen de cómo instalarlo en los sistemas operativos más comunes.
Windows
Descarga Git desde su sitio oficial y ejecuta el instalador siguiendo las instrucciones. Te recomiendo aceptar las opciones predeterminadas, especialmente en cuanto a la PATH variable para poder ejecutar Git desde la consola de comandos.
MacOs
La forma más sencilla de instalar Git en MacOs es a través de la línea de comandos con Homebrew. Desde tu terminar escribe el comando
brew install git
, espera a que la descarga e instalación termine y ya estará listo para usarse.Linux
En la mayoría de las distribuciones de Linux, Git puede instalarse directamente desde el gestor de paquetes predeterminado. Por ejemplo: En Debian/Ubuntu el comando para su instalación es
sudo apt-get install git
. Para otras distribuciones como Fedora el comando essudo dnf install git
, así que dependiendo de la distribución de Linux en la que trabajes será la forma de instalar Git.
Como puedes ver, la instalación de Git realmente depende del sistema operativo con el que trabajes, así que te recomiendo revisar la documentación oficial de Git si quieres profundizar en los detalles de su instalación.
Configuración Inicial
Ya que has instalado Git en tu sistema, es momento de configurar tu identidad y editor predeterminado.
Lo primero es establecer tu usuario y correo electrónico al que se ligará tu actividad con Git, para hacer esto abre tu terminal y ejecuta los siguientes comandos:
# Configura tu nombre de usuario
git config --global user.name "Tu Nombre"
# Configura tu correo electrónico
git config --global user.email "tuemail@ejemplo.com"
El siguiente paso es configurar el editor predeterminado que utiliza Git, por defecto utiliza el que esté configurado para tu sistema operativo, si quieres cambiarlo el comando es git config --global core.editor vim
. Si prefieres utilizar algún otro editor como Nano o Emacs, simplemente reemplaza vim
con nano
o emacs
en el comando anterior.
Ahora sí ya tienes todo listo para comenzar a trabajar con Git, a continuación te dejo una tabla con los comandos usados en esta sección que te puede servir de consulta rápida.
Uso Básico
Creación un Repositorio Git
Iniciar un Repositorio desde Cero
La base de cualquier proyecto gestionado con Git es su repositorio, aquí es donde se almacena el historial de todos los archivos y cambios.
Si quieres comenzar un proyecto con Git, lo primero es crear un nuevo repositorio desde tu terminal.
mkdir NuevoProyecto
cd NuevoProyecto
git init
Este conjunto de comandos lo que hace es crear una nueva carpeta llamada NuevoProyecto, navega dentro de ella y ejecuta el comando git init
, el cual inicializa un nuevo repositorio de Git en esta carpeta.
Clonar un Repositorio ya Existente
Es probable que en lugar de iniciar un repositorio desde cero, tengas que clonar uno ya existente, para esto el comando que necesitas es:
git clone <url_del_repositorio>
La función de este comando es crear una copia local del repositorio en tu máquina, incluyendo todo el historial de cambios.
Gestión de Cambios
Una vez que ya tienes tu repositorio listo, el siguiente paso es llevar el control de los cambios que vas realizando sobre los archivos. Para esto debes de conocer sobre el staging
y los commits
.
Cuando se añade un archivo a un repositorio, Git los marca como untracked. Lo cual lo puedes confirmar usando el comando git status
.
Así como este archivo es marcado como untracked, Git maneja otros cuatro estados para el seguimiento de los archivos, los cuales son:
Untracket. El archivo no está en git, sólo se encuentra en la carpeta del proyecto, o sea en el disco duro.
Unstaged. Son archivos que git tiene dentro de su registro de sus cambios pero que se encuentran desactualizados.
Staged. Archivos que han sido enviados al staging con el comando
git add
.Tracket. Los archivos que se encuentran registrados en el repositorio, están actualizados y no tienen cambios pendientes.
Para que un archivo Git lo incluya en el siguiente commit, hay que hacer uso del comando git add <file>
para incluirlo en tu próximo commit.
Como puedes ver ahora Git te dice que el archivo nuevo esta listo para ser committed, que en español yo siempre lo he traducido como confirmar que quieres guardar los cambios.
Para hacer un commit el comando es git commit -m “Descripción de los cambios realizados”
.
Es recomendable hacer un uso correcto de los commits, por ejemplo, los mensajes deben de ser claros y explicar por qué se hizo el cambio, no solo qué se cambió. Si quieres profundizar en como hacer commits efectivos puedes consultar mi guía sobre cómo trabajar de forma colaborativa con Git.
También puedes acceder al historial de commits para revisar todos los cambios hechos hasta el momento. Esto se hace con el comando git log
.
De esta forma puedes ir salvando los cambios que hagas sobre el proyecto y también revisar cual ha sido ese historial de cambios.
Trabajo con Ramas
Una de las bases de Git es el uso de ramas (branches), ya que desde que se inicia el repositorio se crea la rama principal con el nombre por defecto main.
Se entiende por rama a una representación lineal de los distintos commits en un periodo de tiempo. Es posible crear una rama para realizar modificaciones a nuestro código sin afectar a la rama principal. Un repositorio con diferentes branches podría ser representado de la siguiente forma.
Para crear una nueva rama y empezar a trabajar en ella se utilizan estos comandos:
git branch nueva-rama
git checkout nueva-rama
También se puede hacer esto en un solo comando, el cual es considerado la forma abreviada de crear una rama y pasarse a ella.
git checkout -b nueva-rama
Te recomiendo que antes de hacer un checkout a otra rama, siempre hagas un add/commit al trabajo actual para no perder los cambios de tu rama actual.
Pero bueno, ya creaste una nueva rama, trabajaste sobre ella, ¿ahora como integras esos cambios con la rama principal? bueno, para eso se tienen que fusionar y Git como seguro imaginas tiene un comando para realizar esta acción.
git checkout main
git merge nueva-rama
Si te fijas en los comandos, primero se hace un checkout a la rama principal y después se realiza el merge de la rama nueva. Esto básicamente integra los cambios de nueva-rama a main.
Resolución de Conflictos
Es probable que al intentar integrar tus cambios se generen conflictos y Git no pueda fusionar los cambios automáticamente. Si esto ocurre deberás de resolver primero estos conflictos de manera manual editando los archivos afectados, esto consistirá en aceptar o rechazar los cambios, o incluso mantener tanto lo anterior como lo actual, todo esto dependerá del código en el que hayas trabajado.
La resolución de conflictos es mucho más fácil si la realizas desde tu mismo editor de código, por ejemplo Visual Studio Code te ayuda a visualizar los cambios para que puedas validar que quieres conservar y que no.
Una vez que los conflictos hayan sido resueltos, deberás hacer un git add
seguido de un git commit
para completar el merge.
A continuación te dejo una tabla con los comandos usados en esta sección que te puede servir de consulta rápida.
Repositorios Remotos
Los repositorios remotos son versiones de tu proyecto que se encuentran alojadas en Internet o en una red, lo cual permite a más de una persona colaborar en un proyecto.
Los lugares más populares para alojar tus proyectos actualmente son:
Para usar cualquiera de ellos solo es necesario que te registres y ya puedes empezar a trabajar con las funcionalidades propias de un repositorio remoto, que en general son las mismas en cualquiera de estas tres opciones.
Si quieres agregar un repositorio remoto, el comando a usar es:
git remote add origin <url_repositorio_remoto>
Este comando vincula tu repositorio local con uno remoto llamado origin
. Por otro lado, si quieres remover la referencia puedes usar:
git remote remove origin
Ya que vinculaste tu repositorio local con el remoto, Git te ofrece dos comandos para sincronizar el contenido tanto del repositorio local como del remoto.
El comando push
se utiliza para subir el contenido local al repositorio remoto.
git push origin main
Mientras que pull
se utiliza para actualizar el repositorio local con los cambios más recientes que tenga el repositorio remoto.
git pull origin main
Además del pull
, también se tiene el fetch
, este comando descarga los cambios desde el repositorio remoto, pero no los fusiona con tu rama de forma automática.
git fetch origin
A continuación te dejo una tabla con los comandos usados en esta sección que te puede servir de consulta rápida.
Flujos de Trabajo
Los flujos de trabajo definen cómo los desarrolladores colaboran en un proyecto y cómo el código se revisa y se comparte.
Uno de los flujos de trabajo más populares es el de Git Flow, el cual es un modelo de branching que tiene roles específicos para diferentes ramas y define cómo y cuándo deben interactuar. Las ramas más usuales son:
feature
para nuevas características.develop
para la siguiente versión en desarrollo.release
para preparar la siguiente versión.main
para la versión actual estable.hotfix
para correcciones de emergencia.
Si se quiere añadir una nueva característica se usa:
git checkout -b feature/nueva-caracteristica develop
El comando anterior lo que hace es crear una nueva rama llamada feature/nueva-caracteristica
a partir del contenido de la rama develop
.
Una vez que la nueva característica ha sido desarrollada, se realiza un Pull Request si se trabaja con GitHub o un Merge Request si se trabaja con GitLab, el nombre es diferente pero la funcionalidad es la misma. Para hacer el Pull Request hay que subir los cambios al repositorio.
git push origin feature/nueva-caracteristica
Y luego, desde la interfaz de GitHub o la plataforma en la que estés trabajando, iniciar el Pull o Merge Request.
Integraciones y herramientas adicionales
Aunque Git fue creado para usarse desde la terminal, a través de la línea de comandos, existen varias interfaces gráficas que proporcionan una experiencia visual más amigable, lo cual también ayuda a su adopción y a que lo puedas integrar con mayor confianza a tus proyectos. Algunas de ellas son:
GitHub Desktop: Una aplicación gratuita proporcionada por GitHub que simplifica el desarrollo con una interfaz gráfica.
SourceTree: Una interfaz gráfica poderosa que puede manejar proyectos complejos con Git.
GitKraken: Conocido por su interfaz intuitiva y atractiva, es útil tanto para principiantes como para profesionales.
TortoiseGit: Una alternativa para usuarios de Windows que integra Git en el explorador de archivos.
Estas herramientas proporcionan visualizaciones de ramas, commits y fusiones, y suelen ofrecer funcionalidades de arrastrar y soltar para las acciones de Git, facilitando la comprensión y el manejo del flujo de trabajo.
Además de utilizar herramientas externas, la mayoría de los entornos de desarrollo (IDEs) tienen integración con Git, lo que permite realizar acciones en tu mismo entorno de desarrollo. Algunos de los IDEs son:
Visual Studio Code: Ofrece una integración con Git muy completa, permitiendo hacer commits, visualizar cambios, fusionar ramas y más desde la propia interfaz.
JetBrains: Todos los IDEs de JetBrains poseen una interfaz de usuario para Git que incluye la mayoría de las funciones de línea de comandos y algunas adicionales.
Eclipse: A través del plugin EGit, Eclipse permite a los desarrolladores acceder a una suite completa de funcionalidades de Git.
La integración de Git con estos IDEs agiliza el flujo de trabajo ya que puedes permanecer en el mismo entorno para editar, probar y controlar las versiones de tu código.
Ahora ya conoces los conceptos básicos de Git y un poco más allá, hasta la colaboración en repositorios remotos y el uso de herramientas adicionales. Podemos decir que Git no es solo una herramienta de control de versiones, es tu compañero en el día a día del desarrollo de software, ya que te facilita la colaboración y se encarga de que tu código esté seguro, sin importar lo que suceda, siempre y cuando hayas hecho tus commits en el momento adecuado.
Si te gusta el contenido como este, recuerda suscribirte a mi newsletter, para recibir directo en tu correo una publicación sobre desarrollo de software cada jueves (esta semana ha sido la excepción 😝).
Nos leemos el próximo jueves 👋🏻