laravelgitroadmap

Git básico para proyectos Laravel: guía desde cero

Desarrollar sin Git es como escribir sin guardar el documento. Un error, un experimento que sale mal, un cambio que necesitas deshacer: sin control de versiones pierdes horas de trabajo. Con Git tienes un historial completo de cada cambio, puedes experimentar en ramas separadas y colaborar con otros sin pisarse el trabajo. Para cualquier proyecto Laravel, Git no es opcional.

Qué es Git y por qué usarlo

Git es un sistema de control de versiones distribuido. Registra cada cambio que haces en el código, quién lo hizo y cuándo. Esto te permite:

  • Volver a cualquier versión anterior de tu código.
  • Trabajar en nuevas funcionalidades sin romper la versión estable.
  • Colaborar con otros desarrolladores sin conflictos constantes.
  • Desplegar con confianza sabiendo exactamente qué ha cambiado.

Git trabaja de forma local: tienes toda la historia del proyecto en tu máquina. Los servicios como GitHub, GitLab o Bitbucket son plataformas remotas para sincronizar y compartir ese repositorio.

Instalación y configuración inicial

# En Ubuntu/Debian
sudo apt install git

# En macOS
brew install git

# Verifica la versión
git --version
# git version 2.43.0

# Configuración inicial (obligatorio antes de hacer commits)
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"

# Editor por defecto para los mensajes de commit
git config --global core.editor nano

# Ver la configuración actual
git config --list

Iniciar un repositorio

Tienes dos formas de empezar con Git:

git init — nuevo proyecto

# Crear un nuevo proyecto Laravel
composer create-project laravel/laravel mi-blog

# Entrar al directorio
cd mi-blog

# Inicializar el repositorio Git
git init
# Initialized empty Git repository in /home/carlos/mi-blog/.git/

git clone — proyecto existente

# Clonar un repositorio remoto
git clone https://github.com/usuario/mi-blog.git

# Clonar en una carpeta con nombre diferente
git clone https://github.com/usuario/mi-blog.git nombre-local

# Entrar al proyecto clonado
cd mi-blog

# Instalar las dependencias PHP
composer install

# Configurar el entorno
cp .env.example .env
php artisan key:generate

El staging area y los commits

Git tiene tres zonas: el working directory (tus archivos), el staging area (lo que vas a commitear) y el repositorio (los commits guardados).

# Ver el estado actual
git status

# Añadir un archivo específico al staging
git add app/Http/Controllers/PostController.php

# Añadir múltiples archivos
git add app/Models/Post.php database/migrations/

# Añadir todos los cambios (con cuidado)
git add .

# Ver qué hay en el staging antes de commitear
git diff --staged

# Crear el commit con mensaje
git commit -m "feat: añadir CRUD completo de posts"

# Commit saltándose el staging (para archivos ya tracked)
git commit -am "fix: corregir validación del formulario de contacto"

Buenos mensajes de commit

Un buen mensaje de commit explica el “qué” y el “por qué”:

# Formato convencional (muy usado en proyectos profesionales)
git commit -m "feat: añadir sistema de autenticación con email"
git commit -m "fix: corregir error 500 al subir imágenes mayores de 2MB"
git commit -m "refactor: extraer lógica de pago a PaymentService"
git commit -m "docs: actualizar README con instrucciones de instalación"
git commit -m "chore: actualizar dependencias de Composer"

Prefijos comunes: feat (nueva funcionalidad), fix (corrección de bug), refactor, docs, test, chore.

Ramas (branches)

Las ramas te permiten trabajar en paralelo sin interferir con el código estable:

# Ver todas las ramas
git branch

# Crear una nueva rama
git branch feature/sistema-comentarios

# Cambiar a una rama existente
git checkout feature/sistema-comentarios

# Crear y cambiar en un solo comando (lo más usado)
git checkout -b feature/sistema-comentarios

# Sintaxis moderna (Git 2.23+)
git switch -c feature/sistema-comentarios

# Ver en qué rama estás
git branch --show-current

Flujo de trabajo típico con ramas

# Estás en main, todo estable
git branch
# * main

# Creas una rama para la nueva funcionalidad
git checkout -b feature/autenticacion

# Trabajas y haces commits
git add .
git commit -m "feat: añadir middleware de autenticación"
git commit -m "feat: crear vistas de login y registro"
git commit -m "test: añadir tests para el flujo de autenticación"

# Vuelves a main y fusionas
git checkout main
git merge feature/autenticacion

# Eliminas la rama ya mergeada
git branch -d feature/autenticacion

Repositorios remotos

El remoto es la copia del repositorio en un servidor (GitHub, GitLab, etc.):

# Ver los remotos configurados
git remote -v

# Añadir un remoto
git remote add origin https://github.com/usuario/mi-blog.git

# Subir tu código al remoto por primera vez
git push -u origin main

# Subir cambios después (ya con -u configurado)
git push

# Bajar cambios del remoto
git pull

# Bajar sin fusionar automáticamente
git fetch origin

# Ver el historial de commits
git log --oneline
git log --oneline --graph --all

.gitignore para proyectos Laravel

El archivo .gitignore le dice a Git qué archivos debe ignorar. En Laravel es crítico ignorar correctamente:

# .gitignore para Laravel

# Dependencias (se instalan con composer install)
/vendor/

# Variables de entorno y secretos
.env
.env.backup
.env.production

# Dependencias de Node
/node_modules/

# Caché y archivos generados
/bootstrap/cache/*.php
/storage/*.key
storage/app/public
storage/framework/cache/
storage/framework/sessions/
storage/framework/views/

# Archivos del sistema operativo
.DS_Store
Thumbs.db

# Editor y IDE
.idea/
.vscode/
*.swp

# Archivos compilados
/public/hot
/public/storage
/public/mix-manifest.json

# Logs
*.log

# Tests
.phpunit.result.cache

Laravel ya incluye un .gitignore por defecto al crear el proyecto, pero conviene revisarlo y adaptarlo. Lo más importante es que .env nunca debe subirse al repositorio. Contiene las contraseñas de tu base de datos y otras credenciales.

En su lugar, sube .env.example con los nombres de las variables pero sin valores secretos:

# .env.example (este sí va en git)
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nombre_bd
DB_USERNAME=usuario
DB_PASSWORD=

git log y git status

# Estado del working directory
git status

# Historial compacto
git log --oneline
# a3f9b2c feat: añadir paginación a listado de posts
# 9e1d4a1 fix: corregir redirección tras login
# 7c2f8b3 feat: crear modelo y migraciones de Category

# Historial con ramas visualizado
git log --oneline --graph --all

# Ver qué cambió en un commit concreto
git show a3f9b2c

# Ver diferencias no commiteadas
git diff

# Ver diferencias en staging
git diff --staged

Resolver conflictos básicos

Un conflicto ocurre cuando dos ramas modificaron la misma línea del mismo archivo:

# Al hacer merge, Git avisa del conflicto
git merge feature/nueva-funcionalidad
# CONFLICT (content): Merge conflict in app/Http/Controllers/HomeController.php

# Ver qué archivos tienen conflicto
git status

# Abrir el archivo con conflicto
nano app/Http/Controllers/HomeController.php

El archivo mostrará marcadores como estos:

<<<<<<< HEAD
public function index(): View
{
    $posts = Post::latest()->take(6)->get();
=======
public function index(): View
{
    $posts = Post::with('category')->latest()->paginate(9);
>>>>>>> feature/nueva-funcionalidad

Editas el archivo para dejar el código correcto (una de las versiones, ambas combinadas, o algo nuevo), eliminas los marcadores y luego:

# Marcar el conflicto como resuelto
git add app/Http/Controllers/HomeController.php

# Completar el merge
git commit -m "merge: integrar paginación con categorías"

Flujo de trabajo típico en Laravel

Este es el flujo que usa la mayoría de equipos:

# 1. Actualizar main antes de empezar
git checkout main
git pull origin main

# 2. Crear rama para la nueva funcionalidad
git checkout -b feature/sistema-tags

# 3. Desarrollar: crear migraciones, modelos, controladores
php artisan make:migration create_tags_table
php artisan make:model Tag -mc
# ... código ...

# 4. Commitear en pasos lógicos
git add database/migrations/
git commit -m "feat: añadir migración para tabla de tags"

git add app/Models/Tag.php
git commit -m "feat: crear modelo Tag con relación a Post"

git add app/Http/Controllers/TagController.php
git commit -m "feat: crear TagController con index y show"

# 5. Subir la rama al remoto
git push -u origin feature/sistema-tags

# 6. Crear Pull Request en GitHub/GitLab
# (desde la interfaz web o con gh pr create)

# 7. Tras aprobación, merge a main
git checkout main
git pull origin main

Comandos de rescate

# Deshacer cambios en un archivo (volver al último commit)
git checkout -- app/Models/Post.php

# Sacar un archivo del staging sin perder los cambios
git restore --staged app/Models/Post.php

# Deshacer el último commit manteniendo los cambios
git reset --soft HEAD~1

# Ver todos los commits, incluyendo los "perdidos"
git reflog

Conclusión

Git es una herramienta que se aprende usando. Los comandos básicos los automatizas en pocos días: git status, git add, git commit, git push. Las ramas y los merges los dominas en pocas semanas. Con el .gitignore correcto, un flujo de ramas limpio y commits descriptivos, tu proyecto Laravel tendrá un historial legible y profesional desde el primer día.