Fundamentos de Git

Diego Esteban C 🧢
9 min readSep 25, 2022

--

Artículo básico de introducción a Git. Conceptos claves, flujos de trabajos, ramas y recursos.

Antes de comenzar, debemos entender que es un sistemas de control de versiones

Los sistemas de control de versiones son herramientas fundamentales en el desarrollo de software que nos ayudan a rastrear y gestionar los cambios en nuestro código fuente. Estos sistemas permiten a los equipos de desarrollo registrar, organizar y supervisar todas las modificaciones realizadas en el código a lo largo del tiempo.

Las funcionalidades principales de un sistema de control de versión son las siguientes:

  • Rastrear cambios: Cada modificación en el código se registra, lo que permite tener un historial detallado de quién hizo qué cambio y cuándo.
  • Gestionar Versiones: Se pueden crear y gestionar diferentes versiones del proyecto. Esto es útil para trabajar en nuevas características, corregir errores en versiones anteriores, o mantener versiones estables y de desarrollo simultáneamente.
  • Colaborar eficientemente: Varios desarrolladores pueden trabajar en el mismo proyecto sin conflictos. Estos sistemas facilitan la integración de cambios realizados por diferentes miembros del equipo.
  • Revertir cambios: Si se introduce un error o un cambio no deseado, es fácil revertir a una versión anterior del código.
  • Asegurar integridad: Los cambios en el código se registran de manera que cualquier alteración no autorizada pueda ser detectada y corregida.

NOTA 🤠: En lo personal me gusta describir un sistema de control de versiones como una máquina del tiempo, en la cual podemos avanzar y retroceder según sea necesario, efectuando cambios y corrigiendo errores.

Git

Git es uno de los sistemas de control de versiones más populares en la actualidad, el cual ayuda a los equipos de desarrollo a trabajar de una manera distribuida y flexible sus proyectos. Git fue lanzado el año 2005 por Linus Torvalds, el cual en ese entonces estaba buscando una mejor herramienta para gestionar parches y colaboraciones en el código del kernel Linux.

Desde su lanzamiento, Git ha crecido en popularidad y se ha convertido en la herramienta preferida para muchos desarrolladores y empresas en todo el mundo. Su naturaleza open source y su capacidad para manejar proyectos de cualquier tamaño han contribuido significativamente a su adopción masiva.

A su vez, existen varias plataformas que se basan en Git para ofrecer servicios de alojamiento y colaboración de código. Aquí algunas de las más populares:

Instalación de Git

A continuación algunas guías de referencia para la instalación dependiendo del SO anfitrión:

Flujo de trabajo con Git

El flujo de trabajo en Git se enfoca en manipular archivos usando comandos. Con Git, disponemos de varios comandos que nos permiten realizar diversas tareas en nuestro código, como gestionar cambios, eliminar modificaciones no deseadas, comparar versiones y más.

Los comandos principales se podrían clasificar de la siguiente manera:

  1. Comandos para preparación de entorno.
  2. Comandos para gestionar cambios.
  3. Comandos para gestionar ramas.
  4. Comandos para interactuar con repositorios remotos.
  5. Comandos para revisar el historial.
  6. Comandos para comparar versiones.

A continuación una descripción breve de cada uno de estos comandos y ejemplos básicos.

1- Comandos para preparación de entorno

* git init

Se utiliza para iniciar un nuevo repositorio Git en el directorio actual. Git crea un nuevo subdirectorio dentro del directorio actual que contendrá la estructura de control de versiones de Git. Este subdirectorio se llama .git y es donde Git almacena toda la información necesaria para gestionar las versiones de tu proyecto.

$ git init

* git config

Se utiliza para configurar y gestionar las opciones de configuración del sistema, del usuario y del proyecto Git. Permite establecer información como el nombre de usuario, la dirección de correo electrónico, el editor preferido, y muchas otras configuraciones que afectan el comportamiento de Git.

$ git config --list # Listado de configuraciones
$ git config user.name "[tu_username]" # Configuración del nombre de usuario
$ git config user.email "[tu_correo]" # Configuración del email

2- Comandos para gestionar cambios

Antes de conocer los comandos para gestionar cambios, debemos entender que los archivos en Git se mueven en diferentes áreas para su manipulación. Estas áreas nos permitirán saber si un archivo está preparado para ser enviado al repositorio o simplemente desechar cambios.

Esto nos lleva a conocer a las tres secciones principales de un proyecto de Git: Working directory, Staging area, Local repository.

  1. Working directory: Es la primera sección del flujo, consta de archivos en los que está trabajando actualmente. En esta sección los archivos están con el estado “Untracked” y están disponibles para ser enviados a siguiente sección llamada “Staging area”. Para realizar la operación de traspaso entre estas dos secciones se utiliza el comando git add <file> .
  2. Staging area: Es la segunda sección del flujo, consta de archivos que están siendo preparados para ser añadidos formalmente a nuestro repositorio local. En esta sección los archivos están con el estado “Tracked” y están disponibles para ser enviados a la siguiente sección llamada Local repository”. Para realizar la operación de traspaso entre estas dos secciones se utiliza el comando git commit <file> .
  3. Local repository: Es la última sección del flujo, consta de archivos que están guardados formalmente en el almacenamiento virtual de tu proyecto e inicia el flujo nuevamente en Working directory con los últimos cambios formales.

NOTA 🧐: Debemos mencionar que al navegar por internet, nos encontraremos con diferentes nombres de estados o áreas de Git, como por ejemplo, podemos encontrar que el Staging area es llamado index, o el local repository es llamado Git directory.

* git add

Se utiliza para agregar cambios realizados en archivos al área de preparación (también conocida como el “index” o “staging area”).

$ git add [archivo_o_directorio] # Agrega un archivo o directorio
$ git add . # Agrega todos los archivos del directorio actual

* git commit

Se utiliza para confirmar los cambios realizados en el área de preparación (staging area) y genera una nueva instantánea (snapshot) del archivo agregándolo en el historial del repositorio. Cada commit tiene un identificador único (hash) y un mensaje descriptivo que proporciona información sobre los cambios realizados.

$ git commit -m "[Mensaje descriptivo del commit]"

* git reset

Se utiliza para deshacer cambios en el historial de commits y/o en el área de preparación (staging area). Su función específica depende de las opciones que se utilicen con él.

$ git reset HEAD [archivo_o_directorio] # Deshace un archivo que ya está en el área de preparación (staging area). Esto moverá el archivo de vuelta al directorio de trabajo y lo desvinculará del área de preparación.
$ git reset --soft [hash_commit] # Deshace commits mientras mantiene los cambios en el área de preparación y en el directorio de trabajo.
$ git reset --hard [hash_commit] # Deshace commits y elimina los cambios tanto del área de preparación como del directorio de trabajo.

3- Comandos para gestionar ramas

Antes de conocer estos comandos debemos entender el significado de “ramas” en Git. Las ramas son espacios o entornos independientes para que un desarrollador pueda usar y trabajar sobre el proyecto sin afectar el conjunto de archivos originales.

Las ramas se utilizan básicamente para separar ambientes y colaborar entre desarrolladores en un mismo proyecto sin afectar el uno al otro. El flujo de trabajo de ramas se basa en la bifurcación y convergencia, en donde existe un punto de separación y otro de unión.

https://www.atlassian.com/es/git/tutorials/comparing-workflows/gitflow-workflow

NOTA 🤠: Gracias a las ramas podemos tener flujos de trabajo en paralelo que posteriormente se pueden unir o descartar. Esto facilita el trabajo en equipo.

* git branch

Se utiliza para listar, crear y manipular ramas en tu repositorio. Su función específica depende de las opciones que se utilicen con él. Este comando por defecto lista todas las ramas presentes en tu repositorio local. La rama actual estará marcada con un asterisco (\*).

$ git branch [nombre_de_la_rama] # Este comando crea una nueva rama en tu repositorio, pero no cambia automáticamente a esa rama.
$ git branch -m [nombre_viejo_rama] [nombre_nuevo_rama] # Este renombra una rama.
$ git branch -d [nombre_de_la_rama] # Este comando elimina una rama.

* git checkout

El comando git checkout tiene múltiples usos, entre los cuales destacan el cambio de ramas de trabajo y el cambio a commits específicos.

$ git checkout [nombre_de_la_rama] # Cambiarnos de rama
$ git checkout [commit_hash] # Cambiarnos de commit

* git merge

Se utiliza en Git para combinar cambios de una rama en otra. La idea principal es fusionar el trabajo realizado en una rama con el trabajo de otra, creando un nuevo commit que representa la combinación de ambas líneas de desarrollo. Ten en cuenta que puedes enfrentarte a conflictos que deberás resolver manualmente si se producen cambios en las mismas líneas de código.

$ git merge [nombre_de_la_rama]

4- Comandos para interactuar con repositorios remotos

* git clone

Se utiliza para clonar un repositorio existente. Este comando copia un repositorio Git completo, incluidos todos los archivos, historial y configuraciones, desde un repositorio remoto a tu máquina local.

$ git clone [url_repositorio].git

* git remote

Se utiliza para conectarnos con un servidor Git remoto. Una vez conectado con el repositorio, podemos enviar cambios y actualizaciones a él. También su función específica depende de las opciones que se utilicen con él.

$ git remote add [nombre_origen] [url_origen] # Este comando se utiliza para conectar y agregar un nuevo repositorio remoto a nuestro entorno de trabajo.
$ git remote set-url [nombre_origen] [nueva_url_origen] # Se utiliza para cambiar la URL asociada con un repositorio remoto existente.
$ git remote remove [nombre_origen] # Elimina la conexión a un repositorio remoto.
$ git remote -v # Este comando muestra las URLs de los repositorios remotos configurados actualmente en tu proyecto.

* git fetch

Se utiliza para recuperar cambios desde un repositorio remoto sin fusionar esos cambios en tu rama actual. Básicamente, actualiza tu repositorio local con la información más reciente del repositorio remoto, pero no realiza cambios en tu trabajo actual.

$ git fetch [nombre_origen]

* git pull

Es un comando en Git que combina dos operaciones, realiza un “git fetch” para obtener los cambios del repositorio remoto y luego realiza un “git merge” para fusionar esos cambios en la rama actual en local.

$ git pull [nombre_origen] [nombre_rama_remota]

* git push

Es un comando en Git que se utiliza para enviar los cambios confirmados en tu rama local a un repositorio remoto.

$ git push [nombre_origen] [nombre_rama_local]

5- Comandos para revisar el historial

* git log

Se utiliza para mostrar el historial de confirmaciones (commits) en una rama específica. Este comando proporciona una lista detallada de los commits realizados en esa rama, incluyendo información como el hash del commit, el autor, la fecha y hora, y el mensaje asociado al commit. Su función específica depende de las opciones que se utilicen con él.

$ git log --oneline # Muestra un historial más conciso en una sola línea por cada commit.
$ git log --graph # Muestra un historial con un gráfico ASCII que representa las ramificaciones y fusiones en el repositorio.
$ git show [hash_commit] # Muestra los detalles de un commit específico, incluyendo los cambios realizados en ese commit.

6- Comandos para comparar versiones

* git diff

Comando para comparar y mostrar las diferencias entre distintas versiones de archivos en tu repositorio. Al usar git diff, puedes ver los cambios realizados en los archivos desde el último commit o entre ramas, lo que te ayuda a entender exactamente qué se ha modificado en el código. Esto es útil para revisar los cambios antes de confirmarlos, solucionar problemas o simplemente entender cómo ha evolucionado el código a lo largo del tiempo.

$ git diff [commit_hash] mi_archivo.txt

NOTA 🧐: Recuerda que la mayoría de estos comandos soportan múltiples opciones (banderas). Consultar documentación.

Recursos Git

Gracias por haber llegado hasta aquí, si encuentras esto útil, no olvides aplaudir 👏 . Suscríbete para obtener más contenido 🔔.

Si necesita ayuda adicional, comunícate conmigo 🤠.

Muchas gracias por leer, agradezco su tiempo.

--

--