Cheat Sheet completa de Git


Esta cheat sheet de Git es tu guía de referencia rápida para dominar el control de versiones. Desde comandos básicos hasta flujos de trabajo avanzados, aquí encontrarás todo lo esencial con explicaciones claras de qué hace cada comando.


Configuración inicial

Antes de usar Git, es importante configurar tu identidad y preferencias básicas.

# 🚀 CONFIGURACIÓN INICIAL DE GIT

# 🔹 CONFIGURAR IDENTIDAD (OBLIGATORIO)
git config --global user.name "Tu Nombre"
# Establece tu nombre para todos los repositorios

git config --global user.email "tu.email@ejemplo.com"
# Establece tu email para todos los repositorios

# 🔹 CONFIGURACIONES ÚTILES
git config --global init.defaultBranch main
# Establece 'main' como rama por defecto en nuevos repos

git config --global core.editor "code --wait"
# Configura VS Code como editor por defecto

git config --global core.autocrlf true
# (Windows) Convierte automáticamente LF a CRLF

git config --global core.autocrlf input
# (Mac/Linux) Convierte CRLF a LF al hacer commit

# 🔹 VER CONFIGURACIÓN
git config --list
# Muestra toda la configuración actual

git config user.name
# Muestra solo el nombre configurado

git config user.email
# Muestra solo el email configurado

# 🔹 CONFIGURAR PARA UN REPOSITORIO ESPECÍFICO
git config user.name "Nombre Específico"
# Configura nombre solo para el repo actual (sin --global)

git config user.email "email.especifico@empresa.com"
# Configura email solo para el repo actual

Inicializar repositorio

Comandos para crear y clonar repositorios Git.

# 🚀 INICIALIZAR Y CLONAR REPOSITORIOS

# 🔹 CREAR NUEVO REPOSITORIO
git init
# Inicializa un nuevo repositorio Git en el directorio actual

git init nombre-proyecto
# Crea nueva carpeta y inicializa repositorio Git dentro

# 🔹 CLONAR REPOSITORIO EXISTENTE
git clone https://github.com/usuario/repositorio.git
# Descarga una copia completa del repositorio remoto

git clone https://github.com/usuario/repositorio.git mi-carpeta
# Clona el repositorio en una carpeta con nombre específico

git clone --depth 1 https://github.com/usuario/repositorio.git
# Clona solo el último commit (shallow clone)

git clone --branch dev https://github.com/usuario/repositorio.git
# Clona una rama específica en lugar de la principal

# 🔹 CONECTAR REPOSITORIO LOCAL A REMOTO
git remote add origin https://github.com/usuario/repositorio.git
# Conecta tu repositorio local con un repositorio remoto

git remote -v
# Muestra las URLs de los repositorios remotos configurados

git remote set-url origin https://github.com/usuario/nuevo-repo.git
# Cambia la URL del repositorio remoto

Estados y seguimiento de archivos

Git maneja archivos en diferentes estados. Es importante entender estos estados para trabajar eficientemente.

# 🚀 ESTADOS Y SEGUIMIENTO DE ARCHIVOS

# 🔹 VER ESTADO DEL REPOSITORIO
git status
# Muestra el estado actual: archivos modificados, en staging, etc.

git status --short
# Muestra el estado en formato compacto (M = modificado, A = añadido, etc.)

git status --porcelain
# Formato de estado para scripts (sin color, formato fijo)

# 🔹 AÑADIR ARCHIVOS AL STAGING AREA
git add archivo.txt
# Añade un archivo específico al staging area

git add *.js
# Añade todos los archivos JavaScript al staging area

git add .
# Añade todos los archivos del directorio actual y subdirectorios

git add -A
# Añade todos los archivos del repositorio (incluso eliminados)

git add -u
# Añade solo archivos que ya están siendo tracked (no nuevos)

git add -p
# Añade cambios de forma interactiva (por partes/hunks)

# 🔹 QUITAR ARCHIVOS DEL STAGING AREA
git reset archivo.txt
# Quita archivo específico del staging area (mantiene cambios)

git reset
# Quita todos los archivos del staging area

git restore --staged archivo.txt
# (Comando moderno) Quita archivo del staging area

# 🔹 VER DIFERENCIAS
git diff
# Muestra diferencias entre working directory y staging area

git diff --staged
# Muestra diferencias entre staging area y último commit

git diff HEAD
# Muestra todas las diferencias desde el último commit

git diff archivo.txt
# Muestra diferencias solo para un archivo específico

Commits

Los commits guardan snapshots de tu código en el historial de Git.

# 🚀 COMMITS - GUARDAR CAMBIOS

# 🔹 HACER COMMITS
git commit -m "Mensaje descriptivo del commit"
# Crea un commit con los archivos en staging area

git commit -am "Mensaje del commit"
# Añade automáticamente archivos tracked y hace commit

git commit --amend -m "Nuevo mensaje"
# Modifica el mensaje del último commit

git commit --amend --no-edit
# Añade cambios al último commit sin cambiar el mensaje

# 🔹 COMMITS ESPECÍFICOS
git commit -m "feat: añadir nueva funcionalidad de login"
# Commit siguiendo convenciones (feat, fix, docs, style, etc.)

git commit --allow-empty -m "Trigger deployment"
# Crea commit vacío (útil para triggers de CI/CD)

# 🔹 VER HISTORIAL DE COMMITS
git log
# Muestra historial completo de commits

git log --oneline
# Muestra historial en formato compacto (una línea por commit)

git log --graph
# Muestra historial con gráfico de ramas

git log --graph --oneline --all
# Historial gráfico compacto de todas las ramas

git log -n 5
# Muestra solo los últimos 5 commits

git log --since="2 weeks ago"
# Muestra commits desde hace 2 semanas

git log --author="Juan Pérez"
# Muestra commits de un autor específico

git log --grep="fix"
# Busca commits que contengan "fix" en el mensaje

# 🔹 VER DETALLES DE COMMITS
git show
# Muestra detalles del último commit

git show HEAD~1
# Muestra detalles del penúltimo commit

git show abc123
# Muestra detalles de un commit específico por hash

git show --name-only abc123
# Muestra solo los nombres de archivos modificados en el commit

Branches (Ramas)

Las ramas permiten trabajar en funcionalidades paralelas sin afectar el código principal.

# 🚀 BRANCHES - GESTIÓN DE RAMAS

# 🔹 VER RAMAS
git branch
# Lista todas las ramas locales (* marca la rama actual)

git branch -r
# Lista todas las ramas remotas

git branch -a
# Lista todas las ramas (locales y remotas)

git branch -v
# Lista ramas con el último commit de cada una

# 🔹 CREAR RAMAS
git branch nueva-rama
# Crea una nueva rama desde el commit actual

git checkout -b feature/login
# Crea nueva rama y cambia a ella inmediatamente

git switch -c hotfix/bug-123
# (Comando moderno) Crea nueva rama y cambia a ella

# 🔹 CAMBIAR DE RAMA
git checkout main
# Cambia a la rama main

git switch develop
# (Comando moderno) Cambia a la rama develop

git checkout -
# Cambia a la rama anterior (como cd -)

# 🔹 ELIMINAR RAMAS
git branch -d feature/completada
# Elimina rama local (solo si está merged)

git branch -D feature/experimental
# Fuerza eliminación de rama local (aunque no esté merged)

git push origin --delete feature/vieja
# Elimina rama del repositorio remoto

# 🔹 RENOMBRAR RAMA
git branch -m nuevo-nombre
# Renombra la rama actual

git branch -m viejo-nombre nuevo-nombre
# Renombra una rama específica

# 🔹 TRABAJAR CON RAMAS REMOTAS
git checkout -b local-branch origin/remote-branch
# Crea rama local basada en rama remota

git branch --set-upstream-to=origin/main main
# Configura tracking entre rama local y remota

git push -u origin nueva-rama
# Sube nueva rama y configura tracking automáticamente

Merge y resolución de conflictos

El merge combina cambios de diferentes ramas. Los conflictos ocurren cuando hay cambios incompatibles.

# 🚀 MERGE Y RESOLUCIÓN DE CONFLICTOS

# 🔹 MERGE BÁSICO
git merge feature/nueva-funcionalidad
# Fusiona la rama especificada con la rama actual

git merge --no-ff feature/importante
# Fusiona creando siempre un commit de merge (no fast-forward)

git merge --squash feature/pequenos-cambios
# Fusiona todos los commits de la rama en uno solo

# 🔹 TIPOS DE MERGE
# Fast-forward: Cuando no hay commits nuevos en la rama destino
# Three-way merge: Cuando ambas ramas tienen commits nuevos
# Squash merge: Combina todos los commits en uno solo

# 🔹 ABORTAR MERGE
git merge --abort
# Cancela el merge en progreso y vuelve al estado anterior

# 🔹 RESOLVER CONFLICTOS MANUALMENTE
# 1. Git marca los conflictos en los archivos:
# <<<<<<< HEAD
# Contenido de la rama actual
# =======
# Contenido de la rama que se está fusionando
# >>>>>>> feature/nueva-rama

# 2. Editar archivos para resolver conflictos
# 3. Añadir archivos resueltos:
git add archivo-resuelto.txt
# Marca el archivo como resuelto

# 4. Completar el merge:
git commit
# Completa el merge (Git genera mensaje automático)

# 🔹 HERRAMIENTAS PARA CONFLICTOS
git mergetool
# Abre herramienta visual configurada para resolver conflictos

git config --global merge.tool vimdiff
# Configura vimdiff como herramienta de merge

git config --global merge.tool vscode
# Configura VS Code como herramienta de merge

# 🔹 VER ESTADO DURANTE CONFLICTO
git status
# Muestra archivos con conflictos pendientes

git diff
# Muestra las diferencias y conflictos actuales

git log --merge
# Muestra commits que causan el conflicto

Rebase

Rebase reescribe el historial moviendo commits a una nueva base, creando un historial más limpio.

# 🚀 REBASE - REESCRIBIR HISTORIAL

# 🔹 REBASE BÁSICO
git rebase main
# Mueve los commits de la rama actual encima de main

git rebase origin/main
# Rebasa contra la rama main del repositorio remoto

# 🔹 REBASE INTERACTIVO
git rebase -i HEAD~3
# Abre editor para modificar los últimos 3 commits

# Opciones en rebase interactivo:
# pick: usar el commit tal como está
# reword: cambiar el mensaje del commit
# edit: pausar para modificar el commit
# squash: combinar con el commit anterior
# drop: eliminar el commit

git rebase -i abc123
# Rebasa interactivamente desde el commit especificado

# 🔹 CONTINUAR/ABORTAR REBASE
git rebase --continue
# Continúa el rebase después de resolver conflictos

git rebase --abort
# Cancela el rebase y vuelve al estado original

git rebase --skip
# Omite el commit actual durante el rebase

# 🔹 REBASE vs MERGE
# Merge: Preserva historial completo, crea commits de merge
# Rebase: Crea historial lineal, reescribe commits

# 🔹 CASOS DE USO
git rebase main feature
# Rebasa feature sobre main (sin cambiar de rama)

git pull --rebase
# Hace pull con rebase en lugar de merge

git config --global pull.rebase true
# Configura pull con rebase por defecto

# ⚠️ NUNCA hagas rebase de commits que ya están en repositorio público

Stash

Stash guarda temporalmente cambios sin hacer commit, útil para cambiar de rama rápidamente.

# 🚀 STASH - GUARDAR CAMBIOS TEMPORALMENTE

# 🔹 CREAR STASH
git stash
# Guarda cambios actuales en un stash temporal

git stash push -m "Trabajo en progreso en login"
# Crea stash con mensaje descriptivo

git stash -u
# Incluye archivos untracked en el stash

git stash -a
# Incluye todos los archivos (incluso ignorados)

# 🔹 VER STASHES
git stash list
# Lista todos los stashes guardados

git stash show
# Muestra resumen del stash más reciente

git stash show -p
# Muestra diferencias completas del stash más reciente

git stash show stash@{1}
# Muestra detalles de un stash específico

# 🔹 APLICAR STASH
git stash pop
# Aplica el stash más reciente y lo elimina de la lista

git stash apply
# Aplica el stash más reciente pero lo mantiene en la lista

git stash apply stash@{2}
# Aplica un stash específico por índice

# 🔹 GESTIONAR STASHES
git stash drop
# Elimina el stash más reciente

git stash drop stash@{1}
# Elimina un stash específico

git stash clear
# Elimina todos los stashes

# 🔹 STASH AVANZADO
git stash branch nueva-rama
# Crea nueva rama y aplica stash en ella

git stash push -- archivo.txt
# Hace stash solo de archivos específicos

git stash push -p
# Stash interactivo (elige qué partes guardar)

Repositorios remotos

Los repositorios remotos permiten colaborar y sincronizar código con otros desarrolladores.

# 🚀 REPOSITORIOS REMOTOS - COLABORACIÓN

# 🔹 GESTIONAR REMOTOS
git remote
# Lista nombres de repositorios remotos

git remote -v
# Lista remotos con sus URLs

git remote add origin https://github.com/usuario/repo.git
# Añade un nuevo repositorio remoto

git remote remove upstream
# Elimina un repositorio remoto

git remote rename origin nueva-origin
# Renombra un repositorio remoto

# 🔹 SINCRONIZAR CON REMOTO
git fetch
# Descarga cambios del remoto sin fusionar

git fetch origin
# Descarga cambios de un remoto específico

git fetch --all
# Descarga cambios de todos los remotos

git pull
# Descarga y fusiona cambios (fetch + merge)

git pull --rebase
# Descarga y rebasa cambios locales encima

git pull origin main
# Descarga y fusiona desde rama específica del remoto

# 🔹 ENVIAR CAMBIOS
git push
# Sube cambios al repositorio remoto configurado

git push origin main
# Sube cambios a la rama main del remoto origin

git push -u origin feature/nueva
# Sube nueva rama y configura tracking

git push --force
# Fuerza el push (⚠️ PELIGROSO - puede sobrescribir historial)

git push --force-with-lease
# Push forzado más seguro (verifica que no haya cambios remotos)

# 🔹 GESTIONAR RAMAS REMOTAS
git checkout -b local-branch origin/remote-branch
# Crea rama local basada en rama remota

git push origin --delete old-branch
# Elimina rama del repositorio remoto

git remote prune origin
# Elimina referencias locales a ramas remotas eliminadas

# 🔹 UPSTREAM Y FORK WORKFLOW
git remote add upstream https://github.com/original/repo.git
# Añade repositorio original como upstream (para forks)

git fetch upstream
# Descarga cambios del repositorio original

git checkout main
git merge upstream/main
# Actualiza tu fork con cambios del original

# 🔹 ELIMINAR REPOSITORIO GIT COMPLETO
rm -rf .git
# ⚠️ PELIGROSO: Elimina todo el historial de Git del proyecto (solo archivos locales)
# Después de esto, el directorio ya no será un repositorio Git

# Para reinicializar como nuevo repositorio:
git init
# Inicializa un nuevo repositorio Git desde cero

Deshacer cambios

Git ofrece múltiples formas de deshacer cambios según el estado en que se encuentren.

# 🚀 DESHACER CAMBIOS - CORRECCIÓN DE ERRORES

# 🔹 DESHACER EN WORKING DIRECTORY
git checkout -- archivo.txt
# Descarta cambios locales del archivo (vuelve al último commit)

git restore archivo.txt
# (Comando moderno) Descarta cambios locales del archivo

git checkout .
# Descarta todos los cambios locales

git clean -f
# Elimina archivos no tracked

git clean -fd
# Elimina archivos y directorios no tracked

git clean -n
# Muestra qué archivos se eliminarían (dry run)

# 🔹 DESHACER EN STAGING AREA
git reset HEAD archivo.txt
# Quita archivo del staging area (mantiene cambios locales)

git restore --staged archivo.txt
# (Comando moderno) Quita archivo del staging area

git reset
# Quita todos los archivos del staging area

# 🔹 DESHACER COMMITS
git reset --soft HEAD~1
# Deshace último commit, mantiene cambios en staging

git reset --mixed HEAD~1
# Deshace último commit, mueve cambios a working directory

git reset --hard HEAD~1
# ⚠️ Deshace último commit y ELIMINA todos los cambios

git reset --hard abc123
# Vuelve a un commit específico (ELIMINA todo lo posterior)

# 🔹 REVERTIR COMMITS (SIN REESCRIBIR HISTORIAL)
git revert HEAD
# Crea nuevo commit que deshace el último commit

git revert abc123
# Crea nuevo commit que deshace un commit específico

git revert HEAD~3..HEAD
# Revierte múltiples commits

git revert --no-commit HEAD~3..HEAD
# Revierte múltiples commits sin crear commits automáticos

# 🔹 CORREGIR ÚLTIMO COMMIT
git commit --amend -m "Mensaje corregido"
# Modifica el mensaje del último commit

git add archivo-olvidado.txt
git commit --amend --no-edit
# Añade archivo al último commit sin cambiar mensaje

# 🔹 RECUPERAR COMMITS PERDIDOS
git reflog
# Muestra historial de referencias (incluye commits "perdidos")

git checkout abc123
# Recupera un commit específico del reflog

git branch recover-branch abc123
# Crea rama para recuperar commits perdidos

# ⚠️ DIFERENCIA IMPORTANTE:
# reset: Reescribe historial (peligroso en repos públicos)
# revert: Crea nuevos commits (seguro en repos públicos)

Tags

Los tags marcan puntos específicos en el historial, típicamente para versiones de release.

# 🚀 TAGS - MARCAR VERSIONES

# 🔹 CREAR TAGS
git tag v1.0.0
# Crea tag ligero en el commit actual

git tag -a v1.0.0 -m "Versión 1.0.0 - Primera release"
# Crea tag anotado con mensaje

git tag -a v0.9.0 abc123 -m "Tag en commit específico"
# Crea tag en un commit específico

# 🔹 LISTAR TAGS
git tag
# Lista todos los tags

git tag -l "v1.*"
# Lista tags que coinciden con patrón

git tag -n
# Lista tags con sus mensajes

# 🔹 VER INFORMACIÓN DE TAGS
git show v1.0.0
# Muestra información del tag y su commit

git describe
# Muestra el tag más cercano al commit actual

git describe --tags
# Incluye tags ligeros en la descripción

# 🔹 SUBIR/DESCARGAR TAGS
git push origin v1.0.0
# Sube tag específico al remoto

git push origin --tags
# Sube todos los tags al remoto

git push --follow-tags
# Sube commits y tags asociados

git fetch --tags
# Descarga todos los tags del remoto

# 🔹 ELIMINAR TAGS
git tag -d v1.0.0
# Elimina tag local

git push origin --delete v1.0.0
# Elimina tag del repositorio remoto

git push origin :refs/tags/v1.0.0
# Sintaxis alternativa para eliminar tag remoto

# 🔹 CHECKOUT A TAG
git checkout v1.0.0
# Cambia a un tag específico (estado detached HEAD)

git checkout -b hotfix/v1.0.1 v1.0.0
# Crea nueva rama basada en un tag

# 🔹 CONVENCIONES DE VERSIONADO
# v1.0.0: Major.Minor.Patch (Semantic Versioning)
# v2024.03.15: Fecha (Year.Month.Day)
# release-1.0: Con prefijo descriptivo

Gitignore

El archivo .gitignore especifica qué archivos Git debe ignorar completamente.

# 🚀 GITIGNORE - IGNORAR ARCHIVOS

# 🔹 CREAR .gitignore
touch .gitignore
# Crea archivo .gitignore en la raíz del proyecto

# 🔹 SINTAXIS BÁSICA DE .gitignore
# Archivo específico
config.json

# Todos los archivos con extensión
*.log
*.tmp

# Carpeta completa
node_modules/
dist/

# Archivos en cualquier lugar
**/*.cache

# Negación (incluir archivo específico)
!important.log

# Comentarios
# Este es un comentario

# 🔹 PATRONES COMUNES
# Logs
*.log
npm-debug.log*

# Dependencias
node_modules/
vendor/

# Archivos de build
dist/
build/
*.min.js

# Archivos de entorno
.env
.env.local
.env.production

# Archivos del IDE
.vscode/
.idea/
*.swp

# Archivos del sistema
.DS_Store
Thumbs.db

# 🔹 GESTIONAR ARCHIVOS YA TRACKED
git rm --cached archivo.txt
# Deja de trackear archivo (lo mantiene en disco)

git rm -r --cached node_modules/
# Deja de trackear carpeta completa

git add .gitignore
git commit -m "Añadir .gitignore"
# Confirma los cambios en .gitignore

# 🔹 GITIGNORE GLOBAL
git config --global core.excludesfile ~/.gitignore_global
# Configura .gitignore global para todos los repos

# 🔹 VER ARCHIVOS IGNORADOS
git status --ignored
# Muestra archivos ignorados por .gitignore

git check-ignore archivo.txt
# Verifica si un archivo está siendo ignorado

git check-ignore -v archivo.txt
# Muestra qué regla de .gitignore está aplicando

# 🔹 ARCHIVOS ALREADY TRACKED
# Si un archivo ya está en Git, .gitignore no lo afectará
# Primero debes usar git rm --cached para dejar de trackearlo

# 🔹 TEMPLATES ÚTILES
# Visita gitignore.io para generar .gitignore automáticamente
# para diferentes lenguajes y frameworks

Comandos de información

Comandos para obtener información detallada sobre el estado y historial del repositorio.

# 🚀 COMANDOS DE INFORMACIÓN - INSPECCIÓN

# 🔹 ESTADO DEL REPOSITORIO
git status
# Estado completo: archivos modificados, staging, etc.

git status -s
# Estado en formato corto y compacto

git status --porcelain
# Estado en formato para scripts (sin colores)

# 🔹 DIFERENCIAS Y CAMBIOS
git diff
# Diferencias entre working directory y staging

git diff --staged
# Diferencias entre staging y último commit

git diff HEAD
# Todas las diferencias desde último commit

git diff branch1..branch2
# Diferencias entre dos ramas

git diff HEAD~2 HEAD archivo.txt
# Diferencias en archivo específico entre commits

# 🔹 HISTORIAL DETALLADO
git log --oneline
# Historial compacto en una línea por commit

git log --graph --oneline --all
# Historial gráfico de todas las ramas

git log --stat
# Historial con estadísticas de archivos modificados

git log -p
# Historial con diferencias completas (patch)

git log --follow archivo.txt
# Historial de un archivo específico (incluye renombrados)

git log --grep="fix"
# Busca commits por mensaje

git log --author="Juan"
# Commits de un autor específico

git log --since="2 weeks ago" --until="1 week ago"
# Commits en rango de fechas

# 🔹 INFORMACIÓN DE COMMITS
git show HEAD
# Detalles completos del último commit

git show --name-only HEAD
# Solo nombres de archivos del último commit

git show abc123:archivo.txt
# Contenido de archivo en commit específico

# 🔹 INFORMACIÓN DE RAMAS
git branch -v
# Lista ramas con último commit de cada una

git branch --merged
# Lista ramas que ya están merged en la actual

git branch --no-merged
# Lista ramas que NO están merged

git branch -r
# Lista todas las ramas remotas

# 🔹 INFORMACIÓN DE ARCHIVOS
git ls-files
# Lista todos los archivos tracked por Git

git ls-files --others --ignored --exclude-standard
# Lista archivos ignorados

# 🔹 CULPABILIDAD Y ANOTACIONES
git blame archivo.txt
# Muestra quién modificó cada línea del archivo

git blame -L 10,20 archivo.txt
# Blame solo de líneas 10 a 20

git annotate archivo.txt
# Similar a blame pero con formato diferente

# 🔹 ENCONTRAR CAMBIOS
git bisect start
# Inicia búsqueda binaria para encontrar bug

git bisect bad HEAD
# Marca commit actual como malo

git bisect good v1.0
# Marca versión como buena

git bisect reset
# Termina la búsqueda bisect

# 🔹 ESTADÍSTICAS DEL REPO
git shortlog -s -n
# Estadísticas de commits por autor

git rev-list --count HEAD
# Número total de commits

git ls-remote origin
# Lista referencias del repositorio remoto

# 🔹 VERIFICAR INTEGRIDAD
git fsck
# Verifica integridad del repositorio

git gc
# Limpia y optimiza el repositorio (garbage collection)

Flujos de trabajo

Diferentes estrategias para organizar el trabajo en equipo con Git.

# 🚀 FLUJOS DE TRABAJO - METODOLOGÍAS

# 🔹 GITFLOW
# Ramas principales: main/master (producción) y develop (desarrollo)

# Iniciar nueva feature
git checkout develop
git checkout -b feature/nueva-funcionalidad

# Completar feature
git checkout develop
git merge --no-ff feature/nueva-funcionalidad
git branch -d feature/nueva-funcionalidad

# Preparar release
git checkout develop
git checkout -b release/1.2.0
# Hacer cambios menores y fixes
git checkout main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release 1.2.0"
git checkout develop
git merge --no-ff release/1.2.0

# Hotfix urgente
git checkout main
git checkout -b hotfix/bug-critico
# Hacer fix
git checkout main
git merge --no-ff hotfix/bug-critico
git tag -a v1.2.1 -m "Hotfix 1.2.1"
git checkout develop
git merge --no-ff hotfix/bug-critico

# 🔹 GITHUB FLOW
# Más simple: solo main + feature branches

# Crear feature branch
git checkout main
git pull origin main
git checkout -b feature/nueva-funcionalidad

# Desarrollar y hacer commits
git add .
git commit -m "Implementar nueva funcionalidad"
git push -u origin feature/nueva-funcionalidad

# Hacer Pull Request desde GitHub/GitLab
# Después del merge, limpiar
git checkout main
git pull origin main
git branch -d feature/nueva-funcionalidad

# 🔹 GITLAB FLOW
# Similar a GitHub Flow pero con ramas de ambiente

# Feature branch
git checkout main
git checkout -b feature/login-mejoras

# Merge a staging para testing
git checkout staging
git merge feature/login-mejoras

# Merge a production después de testing
git checkout production
git merge staging

# 🔹 FORKING WORKFLOW
# Para contribuir a proyectos open source

# 1. Fork del repositorio en GitHub
# 2. Clonar tu fork
git clone https://github.com/tu-usuario/proyecto-fork.git

# 3. Añadir upstream original
git remote add upstream https://github.com/original/proyecto.git

# 4. Crear feature branch
git checkout -b feature/mi-contribucion

# 5. Desarrollar y push a tu fork
git push origin feature/mi-contribucion

# 6. Crear Pull Request desde tu fork al original

# 7. Mantener fork actualizado
git fetch upstream
git checkout main
git merge upstream/main

# 🔹 CONVENTIONAL COMMITS
# Formato estándar para mensajes de commit

git commit -m "feat: añadir función de login"
# feat: nueva funcionalidad

git commit -m "fix: corregir bug en validación de email"
# fix: corrección de bug

git commit -m "docs: actualizar README con instrucciones"
# docs: cambios en documentación

git commit -m "style: formatear código según eslint"
# style: cambios de formato (no afectan funcionalidad)

git commit -m "refactor: reorganizar estructura de archivos"
# refactor: cambios de código que no añaden funcionalidad ni corrigen bugs

git commit -m "test: añadir tests para función de login"
# test: añadir o modificar tests

git commit -m "chore: actualizar dependencias"
# chore: tareas de mantenimiento

# Con scope opcional
git commit -m "feat(auth): añadir autenticación con JWT"
git commit -m "fix(ui): corregir alineación de botones"

Comandos avanzados

Funcionalidades avanzadas de Git para casos específicos y flujos complejos.

# 🚀 COMANDOS AVANZADOS - CASOS ESPECIALES

# 🔹 CHERRY-PICK
git cherry-pick abc123
# Aplica un commit específico a la rama actual

git cherry-pick abc123 def456
# Aplica múltiples commits específicos

git cherry-pick --no-commit abc123
# Aplica cambios sin crear commit automáticamente

git cherry-pick -x abc123
# Incluye referencia al commit original

# 🔹 WORKTREE (MÚLTIPLES DIRECTORIOS)
git worktree add ../proyecto-hotfix hotfix/urgente
# Crea directorio separado para trabajar en otra rama

git worktree list
# Lista todos los worktrees activos

git worktree remove ../proyecto-hotfix
# Elimina worktree

# 🔹 SUBTREE (GESTIÓN DE SUBMÓDULOS)
git subtree add --prefix=libs/externa https://github.com/lib/externa.git main
# Añade repositorio externo como subdirectorio

git subtree pull --prefix=libs/externa https://github.com/lib/externa.git main
# Actualiza subtree con cambios upstream

git subtree push --prefix=libs/externa https://github.com/lib/externa.git main
# Envía cambios locales de vuelta al subtree

# 🔹 SUBMODULES (REPOSITORIOS ANIDADOS)
git submodule add https://github.com/lib/externa.git libs/externa
# Añade repositorio como submódulo

git submodule init
# Inicializa submódulos después de clonar

git submodule update
# Actualiza submódulos al commit especificado

git submodule update --remote
# Actualiza submódulos a la última versión

git clone --recursive https://github.com/proyecto/main.git
# Clona proyecto incluyendo todos los submódulos

# 🔹 HOOKS (AUTOMATIZACIÓN)
# Los hooks son scripts que se ejecutan en eventos de Git
# Ubicados en .git/hooks/

# pre-commit: Ejecuta antes de cada commit
#!/bin/bash
npm test
if [ $? -ne 0 ]; then
  echo "Tests fallaron. Commit cancelado."
  exit 1
fi

# post-commit: Ejecuta después de cada commit
#!/bin/bash
echo "Commit realizado: $(git log -1 --pretty=format:'%h %s')"

# pre-push: Ejecuta antes de push
#!/bin/bash
protected_branch='main'
current_branch=$(git symbolic-ref HEAD | sed 's!refs\/heads\/!!')
if [ $protected_branch = $current_branch ]; then
    echo "Push directo a main no permitido"
    exit 1
fi

# 🔹 FILTROS Y LIMPIEZA
git filter-branch --tree-filter 'rm -f passwords.txt' HEAD
# Elimina archivo de todo el historial (⚠️ REESCRIBE HISTORIAL)

git filter-repo --path archivo.txt --invert-paths
# (Herramienta moderna) Elimina archivo del historial

# 🔹 BUNDLE (REPOSITORIO PORTABLE)
git bundle create proyecto.bundle HEAD main
# Crea archivo bundle con rama específica

git clone proyecto.bundle proyecto-copia
# Clona desde bundle

# 🔹 ALTERNATIVAS Y CONFIGURACIÓN
git config --global alias.st status
# Crea alias: git st ejecutará git status

git config --global alias.co checkout
# Alias para checkout

git config --global alias.br branch
# Alias para branch

git config --global alias.unstage 'reset HEAD --'
# Alias para quitar del staging

git config --global alias.last 'log -1 HEAD'
# Alias para ver último commit

git config --global alias.visual '!gitk'
# Alias para herramienta gráfica

# 🔹 MANTENIMIENTO DEL REPOSITORIO
git gc --aggressive
# Optimización agresiva del repositorio

git repack -a -d --depth=250 --window=250
# Reempaqueta objetos para mayor eficiencia

git prune
# Elimina objetos no referenciados

git remote prune origin
# Elimina referencias a ramas remotas eliminadas

# 🔹 DEBUGGING Y ANÁLISIS
git reflog expire --expire=now --all
# Limpia reflog (⚠️ Puede hacer commits irrecuperables)

git rev-parse HEAD
# Muestra hash completo del último commit

git symbolic-ref HEAD
# Muestra referencia simbólica de HEAD

git ls-tree HEAD
# Lista objetos en el commit HEAD

Resolución de problemas comunes

Soluciones para situaciones y errores frecuentes al trabajar con Git.

# 🚀 RESOLUCIÓN DE PROBLEMAS COMUNES

# 🔹 ERROR: "DETACHED HEAD STATE"
# Problema: Te encuentras en un commit específico, no en una rama
git branch new-branch
# Crea nueva rama desde el estado actual

git checkout main
# Vuelve a una rama normal

git checkout new-branch
# Cambia a la nueva rama creada

# 🔹 ERROR: "MERGE CONFLICTS"
# Problema: Conflictos durante merge que necesitan resolución manual

git status
# Ve qué archivos tienen conflictos

# Edita archivos manualmente para resolver conflictos
# Busca marcadores: <<<<<<< ======= >>>>>>>

git add archivo-resuelto.txt
# Marca archivo como resuelto

git commit
# Completa el merge

# O abortar merge si no puedes resolver:
git merge --abort
# Cancela el merge y vuelve al estado anterior

# 🔹 ERROR: "PUSH REJECTED"
# Problema: El remoto tiene commits que no tienes localmente

git pull origin main
# Descarga y fusiona cambios remotos

# O si prefieres rebase:
git pull --rebase origin main
# Rebasa tus commits encima de los remotos

git push origin main
# Ahora puedes hacer push

# 🔹 COMMIT AL BRANCH EQUIVOCADO
# Problema: Hiciste commit en la rama incorrecta

# Opción 1: Mover último commit a otra rama
git branch nueva-rama
# Crea nueva rama desde commit actual

git reset --hard HEAD~1
# Elimina último commit de rama actual

git checkout nueva-rama
# El commit ahora está en la nueva rama

# Opción 2: Cherry-pick a rama correcta
git checkout rama-correcta
git cherry-pick abc123
# Copia commit específico

git checkout rama-incorrecta
git reset --hard HEAD~1
# Elimina commit de rama incorrecta

# 🔹 ARCHIVO GRANDE COMMITADO POR ERROR
# Problema: Añadiste archivo grande que no debería estar en Git

git rm --cached archivo-grande.zip
# Elimina archivo del staging (mantiene en disco)

echo "archivo-grande.zip" >> .gitignore
# Añade a .gitignore para evitar futuros errores

git add .gitignore
git commit -m "Eliminar archivo grande y añadir a .gitignore"

# Si ya está en historial y quieres eliminarlo completamente:
git filter-branch --tree-filter 'rm -f archivo-grande.zip' HEAD
# ⚠️ REESCRIBE HISTORIAL - úsalo con cuidado

# 🔹 OLVIDÉ AÑADIR ARCHIVO AL ÚLTIMO COMMIT
# Problema: Te olvidaste de incluir un archivo en el último commit

git add archivo-olvidado.txt
git commit --amend --no-edit
# Añade archivo al último commit sin cambiar mensaje

# 🔹 QUIERO CAMBIAR EL MENSAJE DEL ÚLTIMO COMMIT
# Problema: El mensaje del último commit tiene errores

git commit --amend -m "Mensaje corregido"
# Cambia mensaje del último commit

# Si ya hiciste push:
git push --force-with-lease
# Push forzado más seguro

# 🔹 PUSH RECHAZADO POR FORCE-PUSH ANTERIOR
# Problema: Alguien hizo force-push y tu historial diverge

git fetch origin
# Descarga estado actual del remoto

git reset --hard origin/main
# ⚠️ CUIDADO: Elimina cambios locales

# O si quieres conservar cambios:
git rebase origin/main
# Rebasa tus cambios encima del remoto

# 🔹 PROBLEMAS CON CRLF/LF
# Problema: Diferencias de line endings entre sistemas

git config --global core.autocrlf true
# (Windows) Auto conversión

git config --global core.autocrlf input
# (Mac/Linux) Solo convertir CRLF a LF

# Si ya tienes problemas:
git add --renormalize .
# Normaliza line endings de archivos existentes

# 🔹 RECUPERAR COMMIT ELIMINADO
# Problema: Eliminaste commits por error

git reflog
# Muestra historial de referencias (incluye commits "perdidos")

git checkout abc123
# Ve al commit perdido

git branch recover-branch
# Crea rama para conservar el commit

# 🔹 REPO CORRUPTO O PROBLEMAS DE INTEGRIDAD
# Problema: Errores de integridad en el repositorio

git fsck
# Verifica integridad del repositorio

git gc --aggressive
# Limpieza agresiva del repositorio

# Si está muy corrupto, puede ser necesario:
git clone https://github.com/usuario/repo.git repo-nuevo
# Clonar de nuevo desde remoto

🎯 Resumen

Esta cheat sheet de Git cubre todos los aspectos esenciales del control de versiones:

  • Configuración inicial para empezar a trabajar con Git
  • Estados y commits para gestionar cambios en el código
  • Branches y merge para trabajo paralelo y colaboración
  • Repositorios remotos para sincronización con equipos
  • Herramientas avanzadas como rebase, stash y tags
  • Flujos de trabajo para organizar el desarrollo en equipo
  • Resolución de problemas para situaciones comunes

Consejos importantes:

  • Siempre haz git status antes de cualquier operación importante
  • Usa mensajes de commit descriptivos y consistentes
  • Crea branches para nuevas funcionalidades
  • Haz git pull antes de git push en ramas compartidas
  • Ten cuidado con comandos que reescriben historial (reset --hard, rebase, force push)

¡Guarda esta referencia y úsala siempre que necesites recordar algún concepto esencial de Git!


Usamos cookies para mejorar tu experiencia. ¿Aceptas las cookies de análisis?