Git es un sistema de control de versiones distribuido rápido, escalable y eficiente. Fue creado por Linus Torvalds en 2005 para el desarrollo del kernel de Linux.
Características principales:
- Sistema distribuido (cada desarrollador tiene una copia completa del historial)
- Extremadamente rápido
- Soporte robusto para desarrollo no lineal (branching y merging)
- Integridad de datos garantizada mediante SHA-1
Arquitectura de Git
Git almacena los datos como instantáneas (snapshots) del proyecto completo, no como diferencias entre archivos. Cada commit es una instantánea completa del estado del proyecto.
Tres áreas principales:
- Working Directory: Tu directorio de trabajo actual
- Staging Area (Index): Área de preparación para el próximo commit
- Repository (.git directory): Base de datos de objetos y metadata
Instalación y Configuración
Instalación
Método 1: Paquetes predeterminados (rápido y estable)
Linux (Ubuntu/Debian):
Linux (Fedora):
macOS:
Windows: Descargar desde: https://git-scm.com/download/win
Método 2: Desde la fuente (versión más reciente)
Instala las dependencias:
Descarga y descomprime la versión deseada (ejemplo: 2.34.1):
Compila e instala:
Verificar Instalación
Configuración Inicial
Configurar identidad (obligatorio):
Editor por defecto:
Configurar rama principal:
Ver configuración:
Niveles de configuración:
--system: Para todos los usuarios del sistema (/etc/gitconfig)--global: Para tu usuario (~/.gitconfig)--local: Para el repositorio actual (.git/config) [predeterminado]
Configuración de claves SSH para GitHub
Generar una clave SSH
Verifica claves existentes:
Si no hay claves, crea el directorio:
mkdir ~/.ssh.Genera un par de claves:
Acepta el nombre predeterminado y añade una contraseña (opcional).
Añadir la clave a ssh-agent
Inicia el agente:
Añade la clave privada:
Vincular la clave a GitHub
Copia la clave pública:
- Linux/Mac:
cat ~/.ssh/id_rsa.pub - Windows:
clip < ~/.ssh/id_rsa.pub
- Linux/Mac:
En GitHub, ve a Settings > SSH and GPG keys > New SSH key, pega la clave y guárdala.
Prueba la conexión:
Resultado esperado:
Hi tu_usuario! You've successfully authenticated...
Conceptos Fundamentales
Objetos de Git
Git maneja cuatro tipos de objetos:
- Blob: Contenido de archivos
- Tree: Estructura de directorios (apunta a blobs y otros trees)
- Commit: Instantánea del proyecto (apunta a un tree y commits padres)
- Tag: Referencia nombrada a un commit específico
Referencias Simbólicas
- HEAD: Apunta al commit actual (normalmente la punta de una rama)
- Rama (branch): Puntero móvil a un commit
- Tag: Puntero fijo a un commit
- Remote: Referencias a ramas en repositorios remotos
Estados de Archivos
- Untracked: Archivos nuevos que Git no rastrea
- Unmodified: Archivos rastreados sin cambios
- Modified: Archivos rastreados con cambios
- Staged: Archivos preparados para el próximo commit
SHA-1 y Hashes
Cada objeto en Git tiene un identificador único de 40 caracteres hexadecimales (hash SHA-1). Puedes usar las primeras 7 caracteres para referencias cortas.
Comandos Básicos
Crear e Inicializar Repositorios
Crear nuevo repositorio:
Clonar repositorio existente:
Solo las últimas n confirmaciones:
Estado y Diferencias
Ver estado del repositorio:
Ver cambios:
git diff # Cambios no staged (no confirmados)
git diff --staged # Cambios staged
git diff --cached # Sinónimo de --staged
git diff HEAD # Todos los cambios desde último commit
git diff <rama1> <rama2> # Diferencias entre ramas
git diff <commit1> <commit2> # Diferencias entre commits
git diff --stat # Resumen estadístico
git diff --name-only # Solo nombres de archivosAñadir Archivos (Staging)
git add <archivo> # Añadir archivo específico
git add . # Añadir todos los archivos del directorio actual
git add -A # Añadir todos los archivos del repositorio
git add *.js # Añadir por patrón
git add -p # Añadir interactivamente por fragmentos
git add -u # Añadir solo archivos ya rastreados modificadosCommits
Crear commit:
git commit -m "Mensaje del commit"
git commit -am "Mensaje" # Add + commit (solo tracked files)
git commit # Abre editor para mensaje largo
git commit --amend # Modificar último commit
git commit --amend -m "Nuevo mensaje" # Cambiar mensaje del último commit
git commit --amend --no-edit # Añadir cambios sin cambiar mensajeBuenas prácticas para mensajes:
- Primera línea: resumen conciso (50 caracteres o menos)
- Línea en blanco
- Descripción detallada (72 caracteres por línea)
- Usar imperativo: “Añade” no “Añadido”
Historial
Ver historial:
git log
git log --oneline # Una línea por commit
git log --graph # Vista gráfica
git log --all # Todas las ramas
git log --decorate # Mostrar referencias (ramas, tags)
git log -p # Mostrar diferencias (patch)
git log -n 5 # Últimos 5 commits
git log --since="2 weeks" # Commits de las últimas 2 semanas
git log --author="Edison" # Commits de un autor
git log --grep="palabra" # Buscar en mensajes de commit
git log -- archivo.txt # Historial de un archivo
git log --follow archivo.txt # Incluir renombradosFormatos personalizados:
Placeholders útiles:
%h: Hash abreviado%H: Hash completo%an: Nombre del autor%ae: Email del autor%ad: Fecha del autor%ar: Fecha relativa%s: Mensaje del commit
Deshacer Cambios
Descartar cambios en working directory:
Quitar archivos del staging area:
Deshacer commits:
Revertir commit (seguro):
Eliminar y Mover Archivos
Branching y Merging
Conceptos de Ramas
Una rama en Git es simplemente un puntero móvil a un commit. La rama por defecto se llama main (anteriormente master).
Operaciones con Ramas
Crear ramas:
Listar ramas:
Cambiar de rama:
Eliminar ramas:
Renombrar rama:
Merging (Fusionar)
Merge básico:
Tipos de merge:
- Fast-forward: Avance directo sin commit de merge
- Three-way merge: Crea commit de merge con dos padres
- Squash merge: Combina todos los commits en uno
Rebasing
Rebase reescribe el historial moviendo commits a una nueva base.
Rebase interactivo - comandos:
pick: Usar commitreword: Cambiar mensajeedit: Editar commitsquash: Fusionar con commit anteriorfixup: Como squash pero descarta mensajedrop: Eliminar commit
⚠️ REGLA DE ORO: Nunca hagas rebase de commits públicos/compartidos
Cherry-pick
Aplicar commits específicos de una rama a otra:
Trabajo Remoto
Repositorios Remotos
Ver remotos:
Añadir remotos:
Modificar remotos:
Fetch, Pull y Push
Fetch (descargar sin fusionar):
Pull (fetch + merge):
Push (enviar cambios):
git push # Push de rama actual
git push origin main # Push a rama específica
git push -u origin main # Push y establecer upstream
git push --all # Push de todas las ramas
git push --tags # Push de todos los tags
git push origin --delete <rama> # Eliminar rama remota
git push --force # ⚠️ Forzar push (PELIGROSO)
git push --force-with-lease # Forzar pero más seguroTracking Branches
Comandos Avanzados
Stash (Guardar Temporalmente)
Guardar cambios sin hacer commit:
git stash # Guardar cambios
git stash save "mensaje" # Con mensaje descriptivo
git stash -u # Incluir archivos untracked
git stash --all # Incluir todo (untracked + ignored)
git stash list # Listar stashes
git stash show # Ver cambios del último stash
git stash show -p # Ver diff completo
git stash apply # Aplicar último stash (lo mantiene)
git stash pop # Aplicar y eliminar último stash
git stash apply stash@{2} # Aplicar stash específico
git stash drop stash@{0} # Eliminar stash específico
git stash clear # Eliminar todos los stashes
git stash branch <rama> # Crear rama desde stashBuscar y Encontrar
Grep (buscar en archivos):
Bisect (búsqueda binaria de bugs):
Blame (ver quién modificó cada línea):
Reflog
Registro de todos los cambios a HEAD (incluso commits “perdidos”):
Worktrees
Tener múltiples working directories del mismo repositorio:
Submodules
Incluir repositorios dentro de repositorios:
Archivos y Bundles
Archive (crear archivo del repositorio):
Bundle (repositorio portátil):
Resolución de Conflictos
Identificar Conflictos
Cuando hay conflictos durante merge o rebase:
Marcadores de Conflicto
<<<<<<< HEAD
Tu versión del código
=======
Su versión del código
>>>>>>> rama-a-fusionar
Resolver Conflictos
Manualmente:
- Editar archivos para resolver conflictos
- Eliminar marcadores
<<<<<<<,=======,>>>>>>> git add <archivo>para marcar como resueltogit commitogit rebase --continue
Con herramientas:
Estrategias:
Git Workflows
Git Flow
Modelo de branching con ramas específicas:
- main: Código de producción
- develop: Rama de desarrollo
- feature/*: Nuevas características
- release/*: Preparación de releases
- hotfix/*: Correcciones urgentes
Comandos (con extensión git-flow):
GitHub Flow
Workflow más simple:
- Crear rama desde
main - Hacer commits
- Abrir Pull Request
- Revisión de código
- Merge a
main - Deploy automático
Trunk-Based Development
- Una rama principal (
mainotrunk) - Commits frecuentes y pequeños
- Feature flags para ocultar trabajo en progreso
- CI/CD robusto
Ejemplos de uso diario de Git
Flujos de trabajo más comunes que uso todos los días en diferentes tipos de proyectos y entornos (individuales, equipos pequeños, medianos y open-source).
Flujo individual / Freelance / Proyectos personales
# Al empezar el día
git pull origin main # Siempre sincronizo primero
git status # Muestra el estado actual del repositorio.
# Trabajo en una nueva funcionalidad
git switch -c feat/login-social # Creo rama con convención clara
# ... desarrollo varias horas ...
git add .
git commit -m "feat: implementar login con Google y GitHub"
# Pequeña corrección rápida
git add src/components/LoginForm.tsx
git commit -m "fix: corregir validación de email en formulario"
# Al final del día o antes de push
git branch -M main # Muestra las ramas existentes.
git switch main
git pull # Vuelvo a sincronizar por si alguien más empujó
git switch feat/login-social
git rebase main # Mantengo mi rama actualizada (rebase limpio)
git switch main
git merge --ff-only feat/login-social # Fast-forward si es posible
git push -u origin main # Envía los cambios al repositorio remoto.
git branch -d feat/login-social # Elimino la rama ya que está integrada
# Opcional: commit squash al final (muy común en proyectos pequeños)
git merge --squash feat/login-social
git commit -m "feat: login con proveedores sociales + validaciones"
git pushVentajas: Muy rápido, historial relativamente limpio, poco overhead.
Flujo típico de equipo mediano/pequeño con Pull Requests
# Inicio de jornada / después de stand-up
git fetch --prune # Limpio referencias remotas obsoletas
git switch main
git pull
# Nueva tarea (ej: ticket #456 - mejorar rendimiento de dashboard)
git switch -c feature/456-dashboard-perf
# Desarrollo normal (varios commits)
git commit -m "feat(dashboard): lazy loading de gráficos pesados"
git commit -m "refactor: extraer hook useChartData"
# Antes de terminar el día
git rebase -i origin/main # O rebase main si ya está actualizado
# Squash/reword si quiero limpiar commits antes de PR
# Subo y creo Pull Request
git push -u origin feature/456-dashboard-perf
# En GitHub/GitLab:
# → Creo PR → añado reviewers → espero revisión
# → Después de aprobar y pasar CI/CD:
# Merge squash / merge commit /
# rebase & merge (depende de la política del equipo)
# Una vez mergeado (normalmente por el reviewer o bot)
git switch main
git pull
git fetch --prune
git branch -d feature/456-dashboard-perf # Limpio localmenteVariante muy común en 2025:
Merge squash → un solo commit limpio en main con el título del PR
Corrección rápida de bug en producción
# Opción más rápida y segura (recomendada)
git switch main
git pull
git switch -c hotfix/789-boton-pago-falla
# Arreglo rápido (1-3 commits)
git commit -m "fix: corregir validación de tarjeta en checkout"
git push -u origin hotfix/789-boton-pago-falla
# → Crear PR rápido hacia main
# → Revisión exprés (o auto-merge si es crítico)
# → Merge (preferiblemente squash o rebase)
# Después del deploy
git switch main
git pull
git tag hotfix-2025-12-30-boton-pago # O v1.2.3-hotfix si usas semver
git push --tagsFlujo cuando trabajas en varias tareas al mismo tiempo
# Estoy en medio de feature/cuenta-premium
git status
# → Aparece bug urgente
git stash push -m "WIP premium checkout"
# Arreglo rápido
git switch -c hotfix/791-api-timeout
# ... fix ...
git commit -m "fix: aumentar timeout en llamada a /reports"
git push -u origin hotfix/791-api-timeout
# → PR rápido → merge
# Vuelvo a lo mío
git switch feature/cuenta-premium
git stash pop
# Continúo donde estaba...Mini-resumen de comandos que más se usan en la práctica diaria
| Acción | Comando más común en 2025 | Frecuencia |
|---|---|---|
| Sincronizar al empezar | git pull / git fetch --prune && git pull |
★★★★★ |
| Crear rama de tarea | git switch -c feat/ticket-xxx-nombre |
★★★★★ |
| Commit atómico | git commit -m "tipo: descripción corta" |
★★★★★ |
| Actualizar rama antes de PR | git rebase main o git merge main |
★★★★ |
| Subir rama nueva | git push -u origin nombre-rama |
★★★★ |
| Limpiar después de merge | git branch -d rama-antigua |
★★★★ |
| Guardar trabajo temporal | git stash push -m "..." / git stash pop |
★★★ |
| Ver estado rápido | git status -sb o alias gs |
★★★★★ |
| Historial bonito | git log --oneline --graph --decorate --all |
★★★★ |
| Comparar con main | git diff main... |
★★★ |
Recomendación final para tu día a día
Adopta el hábito de:
- Siempre
pullal empezar - Trabajar en ramas cortas y con nombres claros
- Commits pequeños y descriptivos (convención Conventional Commits es la más usada actualmente)
- Actualizar tu rama frecuentemente (
rebaseomerge main) - Eliminar ramas una vez integradas
Mejores Prácticas
Commits
- Commits atómicos: Un commit = un cambio lógico
- Mensajes descriptivos: Explica el “qué” y el “por qué”
- Commits frecuentes: Mejor muchos commits pequeños que pocos grandes
- No commitear archivos generados: Usar .gitignore
- Revisar antes de commitear:
git diff --staged
Branching
- Nombres descriptivos:
feature/nueva-funcionalidad,bugfix/issue-123 - Ramas de vida corta: Fusionar frecuentemente
- Mantener ramas actualizadas: Hacer merge/rebase regular de main
- Eliminar ramas fusionadas: Mantener repositorio limpio
- Proteger rama principal: Requerir pull requests y revisiones
Colaboración
- Pull antes de push: Evitar conflictos
- Revisar código: Pull requests con revisiones
- No reescribir historial público: Evitar rebase/amend de commits pusheados
- Comunicación: Documentar decisiones importantes
- CI/CD: Automatizar tests y despliegues
.gitignore
Ejemplos comunes:
Comandos útiles:
Comandos de Bajo Nivel (Plumbing)
Comandos internos de Git para operaciones avanzadas:
Inspección de Objetos
git cat-file -p <hash> # Ver contenido de objeto
git cat-file -t <hash> # Ver tipo de objeto
git cat-file -s <hash> # Ver tamaño de objeto
git ls-tree <tree-hash> # Listar contenido de tree
git ls-files # Listar archivos en index
git ls-files -s # Con información detallada
git ls-remote <remote> # Listar referencias remotasManipulación del Index
Referencias
Objetos y Hashes
Hooks y Automatización
Git Hooks
Scripts que se ejecutan automáticamente en eventos de Git.
Ubicación: .git/hooks/
Hooks comunes:
Client-side:
pre-commit: Antes de crear commitprepare-commit-msg: Antes de abrir editor de commitcommit-msg: Validar mensaje de commitpost-commit: Después de crear commitpre-push: Antes de hacer push
Server-side:
pre-receive: Antes de aceptar pushupdate: Por cada rama actualizadapost-receive: Después de aceptar push
Ejemplo pre-commit (tests):
Ejemplo commit-msg (validar formato):
Aliases
Crear comandos personalizados:
# Configurar aliases
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual 'log --oneline --graph --all --decorate'
git config --global alias.amend 'commit --amend --no-edit'
# Usar aliases
git co main
git visualAliases útiles:
Troubleshooting
Problemas Comunes
Descartar todos los cambios locales:
Recuperar commit eliminado:
Cambiar último commit:
Mover commits a otra rama:
Dividir commit grande:
Sincronizar fork con upstream:
Resolver “detached HEAD”:
Limpiar referencias obsoletas:
Comprimir repositorio:
Ver archivos grandes:
Eliminar archivo del historial:
Referencia Rápida
Sintaxis de Referencias
Especificar Rangos
Variables de Entorno
Configuración Útil
# Colorear output
git config --global color.ui auto
# Guardar credenciales
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
# Autocorrección de comandos
git config --global help.autocorrect 10
# Rebase por defecto al hacer pull
git config --global pull.rebase true
# Prune automático
git config --global fetch.prune true
# Diff mejorado
git config --global diff.algorithm histogram
# Rerere (reuse recorded resolution)
git config --global rerere.enabled trueComandos de Emergencia
# Deshacer TODO y volver limpio
git reset --hard HEAD
git clean -fd
# Recuperar trabajo después de reset --hard
git reflog
git reset --hard <hash>
# Salir de cualquier operación en progreso
git merge --abort
git rebase --abort
git cherry-pick --abort
# Verificar integridad del repositorio
git fsck --full
# Reparar repositorio corrupto
git fsck --full --no-dangling
git gc --aggressive --prune=nowAtajos de Teclado (Shell)
Añadir a ~/.bashrc o ~/.zshrc:
Formato de Commit Convencional
<tipo>(<ámbito>): <descripción>
<cuerpo>
<pie>
Tipos:
feat: Nueva funcionalidadfix: Corrección de bugdocs: Documentaciónstyle: Formato (no afecta código)refactor: Refactorizacióntest: Testschore: Tareas de mantenimientoperf: Mejora de rendimiento
Ejemplo:
feat(auth): añadir autenticación con OAuth2
Implementa login con Google y GitHub usando OAuth2.
Incluye manejo de tokens y refresh automático.
Closes #123
Recursos Adicionales
Documentación Oficial
- Manual de Git:
man gito https://git-scm.com/docs - Libro Pro Git: https://git-scm.com/book/es/v2
- Git Reference: https://git-scm.com/docs
Tutoriales y Cursos
- Learn Git Branching: https://learngitbranching.js.org
- Git Tutorial de Atlassian: https://www.atlassian.com/git/tutorials
- GitHub Learning Lab: https://lab.github.com
Herramientas
- GitKraken: Cliente visual multiplataforma
- SourceTree: Cliente visual de Atlassian
- Fork: Cliente Git para Mac y Windows
- lazygit: Cliente TUI (terminal) simple y potente
- tig: Navegador de texto para repositorios Git
Extensiones
- git-extras: Comandos útiles adicionales
- git-flow: Extensión para Git Flow workflow
- git-lfs: Large File Storage
- git-filter-repo: Reescritura avanzada de historial
Glosario
Blob: Objeto que contiene el contenido de un archivo.
Branch (Rama): Puntero móvil a un commit que representa una línea de desarrollo.
Checkout: Cambiar el working directory a un commit, rama o tag específico.
Clone: Crear una copia local de un repositorio remoto.
Commit: Instantánea del proyecto en un momento específico.
Conflict (Conflicto): Situación donde Git no puede fusionar cambios automáticamente.
Detached HEAD: Estado donde HEAD apunta directamente a un commit en lugar de a una rama.
Diff: Diferencias entre dos versiones de archivos.
Fast-forward: Tipo de merge donde simplemente se avanza el puntero de la rama.
Fetch: Descargar objetos y referencias desde un repositorio remoto sin fusionar.
Fork: Copia de un repositorio en tu propia cuenta.
HEAD: Referencia al commit actual.
Index: Área de staging donde se preparan cambios para el próximo commit.
Merge: Fusionar cambios de una rama a otra.
Origin: Nombre por defecto del repositorio remoto principal.
Pull: Fetch + Merge en un solo comando.
Pull Request: Solicitud para fusionar cambios (terminología de GitHub).
Push: Enviar commits locales a un repositorio remoto.
Rebase: Mover o combinar commits a una nueva base.
Remote: Repositorio alojado en otro lugar (servidor).
Repository (Repositorio): Colección de commits, ramas y configuración de un proyecto.
SHA-1: Algoritmo hash usado para identificar objetos de Git.
Staging Area: Sinónimo de Index.
Stash: Guardar temporalmente cambios sin hacer commit.
Tag: Referencia permanente a un commit específico.
Tree: Objeto que representa un directorio.
Upstream: Rama remota que una rama local rastrea.
Working Directory (Directorio de Trabajo): Directorio actual con archivos del proyecto.
Conclusión
Git es una herramienta poderosa y flexible que requiere práctica para dominar. Esta guía cubre desde conceptos básicos hasta técnicas avanzadas, pero la mejor forma de aprender es usándolo en proyectos reales.
Consejos finales:
- Practica regularmente
- Experimenta en repositorios de prueba
- Lee los mensajes de error (son informativos)
- Usa
git help <comando>cuando tengas dudas - No temas equivocarte (casi todo se puede deshacer)
Comandos más importantes para recordar:
echo "# Léeme" >> README.md: Crea un archivo README.md con el texto “# Léeme”.git init: Inicia un nuevo repositorio en el directorio actual.git status- Siempre saber dónde estásgit add- Preparar cambiosgit commit -m "Primer commit"- Guardar cambiosgit branch -M main: Muestra las ramas existentes.git push -u origin main- Compartir cambiosgit pull- Obtener cambiosgit log- Ver historial de commitsgit diff- Ver diferenciasgit checkout [branch]: Cambia a una rama específica.git merge [branch]: Fusiona una rama con la actual.
Publicaciones Similares
Si te interesó este artículo, te recomendamos que explores otros blogs y recursos relacionados que pueden ampliar tus conocimientos. Aquí te dejo algunas sugerencias:
- Comandos De Informacion Windows
- Adb
- Limpieza Y Optimizacion De Pc
- Usando Apk En Windown 11
- Gestionar Versiones De Jdk En Kubuntu
- Instalar Tor Browser
- Crear Enlaces Duros O Hard Link En Linux
- Comandos Vim
- Guia De Git Y Github
- 00 Primeros Pasos En Linux
- 01 Introduccion Linux
- 02 Distribuciones Linux
- 03 Instalacion Linux
- 04 Administracion Particiones Volumenes
- Atajos De Teclado Y Comandos Para Usar Vim
- Instalando Specitify
- Gestiona Tus Dotfiles Con Gnu Stow
Esperamos que encuentres estas publicaciones igualmente interesantes y útiles. ¡Disfruta de la lectura!