¿Qué es Git?
Git es un sistema de control de versiones distribuido (DVCS - Distributed Version Control System) que permite registrar, gestionar y controlar los cambios realizados sobre archivos a lo largo del tiempo.
Fue creado por Linus Torvalds en 2005 para el desarrollo del núcleo Linux y actualmente es el sistema de control de versiones más utilizado en el desarrollo de software.
Su principal objetivo es facilitar el trabajo colaborativo, mantener un historial completo de cambios y permitir recuperar versiones anteriores de un proyecto.
Conceptos fundamentales
Para comprender Git es imprescindible conocer los siguientes conceptos:
- Repositorio (Repository): proyecto gestionado por Git.
- Commit: instantánea del estado del proyecto.
- Branch (Rama): línea independiente de desarrollo.
- Merge: unión de cambios entre ramas.
- Remote: repositorio alojado en un servidor remoto.
- HEAD: referencia al commit actual.
Funcionamiento de Git
El flujo de trabajo habitual sigue estas etapas:
Archivos
↓
Working Directory
↓
git add
↓
Staging Area
↓
git commit
↓
Repositorio Local
↓
git push
↓
Repositorio Remoto
Cada modificación queda registrada mediante commits, que permiten reconstruir cualquier estado anterior del proyecto.
Características de Git
Git presenta las siguientes características:
- Sistema distribuido.
- Alto rendimiento.
- Historial completo de cambios.
- Trabajo mediante ramas.
- Integridad de los datos mediante hashes.
- Soporte para trabajo colaborativo.
Repositorios
Un repositorio es el lugar donde Git almacena el historial y el contenido del proyecto.
Existen dos tipos principales:
Repositorio local
Se encuentra en el equipo del desarrollador.
Permite:
- Crear commits.
- Crear ramas.
- Consultar el historial.
- Trabajar sin conexión.
Repositorio remoto
Se aloja en un servidor compartido.
Permite:
- Compartir el proyecto.
- Sincronizar cambios.
- Colaborar con otros desarrolladores.
Estados de los archivos
Un archivo puede encontrarse en distintos estados durante el ciclo de trabajo.
| Estado | Descripción |
|---|---|
| Untracked | Git aún no controla el archivo. |
| Modified | El archivo ha sido modificado. |
| Staged | El cambio está preparado para el siguiente commit. |
| Committed | El cambio ya forma parte del historial del repositorio. |
Commits
Un commit representa una instantánea del proyecto en un momento determinado.
Cada commit contiene:
- Identificador único (hash).
- Autor.
- Fecha.
- Mensaje descriptivo.
- Referencia al commit anterior.
Ramas (Branches)
Las ramas permiten desarrollar funcionalidades de forma independiente sin afectar a la rama principal.
Las operaciones más habituales son:
- Crear una rama.
- Cambiar de rama.
- Fusionar ramas.
- Eliminar ramas.
main
│
├───────────┐
│ │
feature │
│ │
└────merge──┘
↓
main
Merge
El merge consiste en integrar los cambios de una rama dentro de otra.
Existen dos situaciones:
- Merge automático: Git combina los cambios sin problemas.
- Conflicto de merge: varios usuarios modifican la misma parte del archivo y Git requiere intervención manual.
Comandos principales
Los comandos más utilizados son:
| Comando | Función |
|---|---|
| git init | Inicializa un repositorio. |
| git clone | Copia un repositorio existente. |
| git status | Muestra el estado del proyecto. |
| git add | Añade cambios al área de preparación. |
| git commit | Guarda una instantánea del proyecto. |
| git log | Muestra el historial de commits. |
| git branch | Gestiona ramas. |
| git checkout | Cambia de rama o recupera versiones. |
| git merge | Fusiona ramas. |
| git pull | Descarga e integra cambios remotos. |
| git push | Envía commits al repositorio remoto. |
Flujo de trabajo básico
El desarrollo típico sigue esta secuencia:
- Modificar archivos.
- Ejecutar git status.
- Añadir cambios con git add.
- Crear un commit mediante git commit.
- Descargar cambios remotos con git pull.
- Enviar los commits mediante git push.
Comparación Git vs Sistemas centralizados
| Git | Sistema centralizado |
|---|---|
| Distribuido | Centralizado |
| Historial completo en cada equipo | Historial en el servidor |
| Puede trabajar sin conexión | Requiere conexión frecuente |
| Alta tolerancia a fallos | Dependencia del servidor central |
| Ramas muy rápidas | Ramas más costosas |
Caso práctico
Situación
Dos desarrolladores trabajan sobre la misma aplicación.
- El desarrollador A crea una nueva funcionalidad.
- El desarrollador B corrige un error.
Cada uno trabaja en una rama distinta.
Cuando finalizan:
- Ambos realizan sus commits.
- Envían los cambios al repositorio remoto.
- Se fusionan las ramas mediante merge.
Si ambos modificaron la misma línea del mismo archivo, Git solicitará resolver un conflicto antes de completar la integración.
Ventajas e inconvenientes
Ventajas
- Historial completo de cambios.
- Trabajo distribuido.
- Desarrollo paralelo mediante ramas.
- Recuperación sencilla de versiones anteriores.
- Alto rendimiento.
- Excelente soporte para trabajo colaborativo.
Inconvenientes
- Curva de aprendizaje inicial.
- Conflictos durante la fusión de ramas.
- Gran cantidad de comandos disponibles.
- No resulta adecuado para archivos binarios de gran tamaño.
Errores habituales
- Confundir Git con GitHub.
- Pensar que Git necesita conexión a Internet para funcionar.
- Olvidar realizar git add antes del commit.
- Confundir git fetch, git pull y git push.
- Trabajar directamente sobre la rama principal.
- No escribir mensajes descriptivos en los commits.
Cómo evitarlos
- Diferenciar Git del servicio de alojamiento de repositorios.
- Comprender el flujo Working Directory → Staging → Commit.
- Utilizar ramas para nuevas funcionalidades.
- Realizar commits pequeños y frecuentes.
- Sincronizar periódicamente con el repositorio remoto.
Relaciones con otros temas
Git está estrechamente relacionado con:
- Desarrollo de software.
- Integración continua (CI).
- Despliegue continuo (CD).
- DevOps.
- GitHub.
- GitLab.
- Control de versiones.
- Trabajo colaborativo.
- Gestión de proyectos software.
Conceptos clave para recordar
[!NOTE]
- Git es un sistema de control de versiones distribuido (DVCS).
- Cada desarrollador dispone de una copia completa del repositorio.
- El flujo habitual es: Working Directory → Staging Area → Commit → Repositorio remoto.
- Un commit representa una instantánea del proyecto.
- Las ramas (branches) permiten desarrollar funcionalidades de forma independiente.
- El merge integra los cambios de distintas ramas y puede generar conflictos.
- git add prepara cambios, git commit los registra, git pull sincroniza cambios remotos y git push publica los commits.
- Git puede utilizarse completamente sin conexión; la conexión solo es necesaria para interactuar con repositorios remotos.
- Git es el estándar de facto para el control de versiones en el desarrollo de software moderno.