🔍
0%

¿Qué es Git?

Un sistema de control de versiones distribuido, gratuito y de código abierto, diseñado para manejar proyectos con velocidad y eficiencia.

¿Por qué usar Git?

📜
Historial completo
Cada cambio queda registrado con autor, fecha y descripción.
🌿
Trabajo en paralelo
Crea ramas independientes para features o correcciones sin afectar el código principal.
☁️
Colaboración
Múltiples personas trabajando en el mismo proyecto sin conflictos.
↩️
Recuperación
Revierte a cualquier versión anterior en segundos.

Los tres estados de Git

Todo archivo en Git vive en uno de estos tres estados:

📝
Working Dir
modificado

git add
📋
Staging Area
preparado

git commit
🗄️
Repository
confirmado
💡
Concepto clave: El Staging Area (área de preparación) te permite seleccionar exactamente qué cambios incluir en el próximo commit, dándote control granular sobre el historial.

Git vs GitHub

🔧
Git Local
Herramienta de línea de comandos. Gestiona versiones localmente en tu computadora.
🌐
GitHub / GitLab Nube
Plataformas web que alojan repositorios Git. Añaden colaboración, CI/CD y más.

Instalación & Configuración

Instalar Git

🪟
Windows
Descarga el instalador en git-scm.com o usa winget.
🍎
macOS
Usa Homebrew: brew install git
🐧
Linux (Ubuntu/Debian)
sudo apt install git
Verificar instalación
git --version
# Salida esperada: git version 2.x.x

Configuración inicial

Lo primero que debes hacer al instalar Git es configurar tu nombre y email. Estos datos se incluyen en cada commit.

Configuración global
# Nombre de usuario
git config --global user.name "Tu Nombre"

# Email
git config --global user.email "[email protected]"

# Editor por defecto (VS Code)
git config --global core.editor "code --wait"

# Rama principal por defecto
git config --global init.defaultBranch main

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

Niveles de configuración

NivelFlagArchivoAlcance
System--system/etc/gitconfigTodos los usuarios del sistema
Global--global~/.gitconfigTu usuario en el sistema
Local--local.git/configSolo el repositorio actual
⚠️
La configuración local sobreescribe a la global, que a su vez sobreescribe a la de system. Útil para tener distintos emails en proyectos personales vs laborales.

Primeros Pasos

Crear un repositorio

  • 1
    Crea una carpeta y entra en ella

    Será el directorio raíz de tu proyecto.

  • 2
    Inicializa Git con git init

    Crea la carpeta oculta .git/ con todos los metadatos del repositorio.

  • 3
    ¡Listo para versionar!

    Ya puedes empezar a trackear archivos con git add.

Inicializar repositorio
# Crear carpeta del proyecto
mkdir mi-proyecto
cd mi-proyecto

# Inicializar Git
git init
# → Initialized empty Git repository in .../mi-proyecto/.git/

# Clonar un repositorio existente
git clone https://github.com/usuario/repo.git
git clone https://github.com/usuario/repo.git mi-carpeta

El archivo .gitignore

Le indica a Git qué archivos o carpetas no debe trackear.

.gitignore
# Dependencias
node_modules/
.env

# Build
dist/
*.log

# OS
.DS_Store
Thumbs.db
💡
Usa gitignore.io para generar .gitignore automáticamente según tu lenguaje y entorno.

Ciclo de trabajo básico

El ciclo de vida de un cambio en Git sigue siempre el mismo patrón: modificar → preparar → confirmar.

📝
Modificas
archivos

git add
📋
Staging
Area

git commit
🗄️
Local
Repo

git push
☁️
Remote
Repo

git status — Estado del repositorio

git status
git status           # Estado completo
git status -s        # Formato corto

git add — Preparar cambios

git add
git add archivo.txt    # Archivo específico
git add src/           # Toda una carpeta
git add .             # Todos los cambios
git add -p            # Modo interactivo (selecciona hunks)
git add *.js          # Por patrón glob

git commit — Confirmar cambios

git commit
git commit -m "feat: añadir login de usuario"
git commit -am "fix: corregir bug en navbar"   # add + commit
git commit                                      # Abre editor
git commit --amend                             # Modifica último commit

Buenas prácticas para mensajes de commit

Conventional Commits
# Formato: tipo(alcance): descripción corta

feat(auth): añadir autenticación con Google
fix(ui): corregir overflow en móviles
docs: actualizar README con instrucciones de build
refactor(api): simplificar lógica de paginación
test: añadir tests para módulo de pagos
chore: actualizar dependencias a última versión
Reglas de oro:
  • Primera línea: máximo 72 caracteres
  • Usa el imperativo presente: "añadir", no "añadí" ni "añadiendo"
  • Cada commit debe ser una unidad lógica de cambio

Ramas (Branches)

Las ramas permiten desarrollar features, arreglar bugs y experimentar de forma aislada sin afectar el código estable.

main A ─── B ─────────────────── M \ / feature C ─── D ─── E ─' ↑ nueva feature

Gestión de ramas

Comandos de ramas
# Listar ramas
git branch               # Locales
git branch -a           # Locales + remotas

# Crear rama
git branch feature/login

# Cambiar de rama
git switch feature/login
git checkout feature/login   # Forma clásica

# Crear y cambiar en un paso
git switch -c feature/login
git checkout -b feature/login

# Eliminar rama
git branch -d feature/login   # Seguro
git branch -D feature/login   # Forzado

# Renombrar rama actual
git branch -m nuevo-nombre

Merge — Fusionar ramas

git merge
# 1. Posicionarse en la rama destino
git switch main

# 2. Fusionar la rama feature
git merge feature/login

# Merge sin fast-forward (crea commit de merge)
git merge --no-ff feature/login

# Abortar un merge conflictivo
git merge --abort

Rebase — Reescribir historia

git rebase
# Rebasar feature sobre main
git switch feature/login
git rebase main

# Rebase interactivo (últimos 3 commits)
git rebase -i HEAD~3

# Continuar/abortar rebase
git rebase --continue
git rebase --abort

Resolver conflictos

  • 1
    Git marca los conflictos en el archivo

    Verás marcadores <<<<<<<, =======, >>>>>>>

  • 2
    Edita el archivo y elige qué versión mantener

    Elimina los marcadores y deja el código que deseas.

  • 3
    Confirma la resolución

    git add archivo.txtgit commit

🚨
Regla de oro del rebase: Nunca hagas rebase en ramas que ya están en el repositorio remoto y que otras personas usan. Solo hazlo en ramas locales o feature branches propias.

Repositorios Remotos

Conectar con el remoto

git remote
# Listar remotos
git remote -v

# Añadir remoto
git remote add origin https://github.com/user/repo.git

# Cambiar URL del remoto
git remote set-url origin https://github.com/user/nuevo-repo.git

# Eliminar remoto
git remote remove origin

Push, Pull y Fetch

Sincronización
# Subir cambios al remoto
git push origin main
git push                         # Si ya está trackeada
git push -u origin feature/login # Primera vez + track
git push --force-with-lease      # Push forzado seguro

# Descargar y fusionar cambios
git pull                         # fetch + merge
git pull --rebase               # fetch + rebase

# Solo descargar (sin fusionar)
git fetch
git fetch origin

Flujo completo con GitHub

  • 1
    Fork o clone del repo

    git clone https://github.com/org/proyecto.git

  • 2
    Crea una rama para tu feature

    git switch -c feature/mi-cambio

  • 3
    Haz tus commits

    git add . && git commit -m "feat: mi cambio"

  • 4
    Sube la rama

    git push -u origin feature/mi-cambio

  • 5
    Abre un Pull Request en GitHub

    Describe los cambios, asigna revisores y espera la aprobación.

ℹ️
git fetch vs git pull: fetch descarga los cambios remotos pero no los aplica — puedes revisarlos antes de mergear. pull hace fetch + merge automáticamente. Prefiere fetch en entornos compartidos para tener control total.

Historial & Diff

git log — Ver el historial

git log
git log                     # Historial completo
git log --oneline           # Una línea por commit
git log --oneline --graph   # Con árbol visual
git log -n 10              # Últimos 10 commits
git log --author="Ana"      # Por autor
git log --since="2024-01-01" # Por fecha
git log --grep="fix"        # Por mensaje
git log --follow src/app.js # Historial de archivo

# Formato personalizado
git log --pretty=format:"%h %an %s"

git diff — Ver diferencias

git diff
git diff                     # Working dir vs staging
git diff --staged            # Staging vs último commit
git diff HEAD~1              # Penúltimo vs actual
git diff main feature/login  # Entre ramas
git diff abc123 def456       # Entre commits

git show y git blame

Inspección detallada
# Ver detalles de un commit específico
git show abc123
git show HEAD

# Ver quién escribió cada línea
git blame src/index.js
git blame -L 10,25 src/index.js  # Líneas 10 a 25

Deshacer cambios

⚠️
Importante: Algunos comandos reescriben el historial. Evita usarlos en ramas compartidas o ya pusheadas.

Mapa de situaciones

SituaciónComandoSeguridad
Descartar cambios en working dirgit restore archivo.txtSeguro
Sacar archivo del staginggit restore --staged archivo.txtSeguro
Revertir un commit (crea nuevo)git revert abc123Seguro
Deshacer commits (mantener cambios)git reset --soft HEAD~1Local
Deshacer commits y staginggit reset --mixed HEAD~1Local
Deshacer TODO (sin recuperar)git reset --hard HEAD~1Peligroso
Deshacer en detalle
# Restaurar archivo al último commit
git restore archivo.txt

# Quitar del staging (mantiene cambios)
git restore --staged archivo.txt

# Revertir commit (forma segura para historial público)
git revert abc123

# Mover HEAD N commits atrás (mantiene cambios staged)
git reset --soft HEAD~2

# Recuperar commit eliminado (con reflog)
git reflog
git cherry-pick abc123
🛡️
git reflog es tu red de seguridad. Guarda un registro de todos los movimientos de HEAD durante ~90 días. Puedes recuperar casi cualquier commit "perdido" con git reflog seguido de git cherry-pick o git reset.

Stash & Tags

git stash — Guardar trabajo temporal

Útil cuando necesitas cambiar de rama sin hacer commit de cambios incompletos.

git stash
# Guardar cambios
git stash
git stash push -m "wip: formulario de contacto"
git stash push -u        # Incluye archivos no tracked

# Listar stashes
git stash list

# Aplicar stash
git stash pop            # Aplica y elimina del stash
git stash apply stash@{1} # Aplica uno específico

# Eliminar stash
git stash drop stash@{0}
git stash clear          # Elimina todos

git tag — Marcar versiones

git tag
# Listar tags
git tag
git tag -l "v1.*"         # Por patrón

# Crear tag
git tag v1.0.0            # Ligero
git tag -a v1.0.0 -m "Primera release"  # Anotado

# Subir tags al remoto
git push origin v1.0.0   # Un tag
git push origin --tags   # Todos los tags

# Eliminar tag
git tag -d v1.0.0
git push origin --delete v1.0.0

Cheat Sheet

Referencia rápida de todos los comandos. Haz clic en cualquier fila para copiar el comando.

⚙️ Configuración
git config --global user.nameConfigurar nombre
git config --global user.emailConfigurar email
git config --listVer configuración
📂 Repositorio
git initInicializar repo
git clone <url>Clonar repo remoto
git statusEstado del repo
📝 Staging
git add .Agregar todo
git add -pModo interactivo
git restore --stagedQuitar del staging
💾 Commits
git commit -mCommit con mensaje
git commit --amendModificar último commit
git log --onelineVer historial corto
🌿 Ramas
git switch -c <rama>Crear y cambiar rama
git branch -d <rama>Eliminar rama
git merge <rama>Fusionar rama
☁️ Remoto
git push -u origin mainSubir rama por primera vez
git pull --rebaseBajar y rebasar
git fetch originDescargar sin mergear
↩️ Deshacer
git restore <archivo>Descartar cambios
git revert HEADRevertir último commit
git reset --soft HEAD~1Deshacer commit (seguro)
📦 Stash & Tags
git stash push -mGuardar trabajo temporal
git stash popRestaurar stash
git tag -a v1.0.0Crear tag anotado
✓ Copiado al portapapeles

Quiz Interactivo

Pon a prueba tus conocimientos de Git. Respuestas correctas: 0 / 0