
El flujo de trabajo Git que se usa en equipos reales, de principio a fin: crear rama, hacer commits, abrir un pull request y fusionar limpiamente.
Configuración inicial (una vez)
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"
git config --global init.defaultBranch main
git config --global pull.rebase false # merge al hacer pull
git config --list # verificar configuración
Empezar un proyecto
# Repositorio nuevo
git init
git add .
git commit -m "feat: commit inicial"
git remote add origin git@github.com:usuario/repo.git
git push -u origin main
# Clonar repositorio existente
git clone git@github.com:usuario/repo.git
git clone git@github.com:usuario/repo.git mi-carpeta # con nombre personalizado
Flujo diario: rama → commit → push
# 1. Asegurarte de partir de main actualizado
git switch main
git pull origin main
# 2. Crear rama para la tarea
git switch -c feature/login-con-google
# o la nomenclatura del equipo: fix/bug-123, chore/actualizar-deps, etc.
# 3. Trabajar: hacer cambios, añadir, commitear
git status # ver estado del repositorio
git diff # ver cambios no añadidos
git diff --staged # ver cambios ya añadidos
git add archivo.ts # añadir archivo concreto
git add src/ # añadir directorio
git add -p # añadir cambios por fragmentos (recomendado)
git add . # añadir todo (usar con cuidado)
git commit -m "feat: añadir login con Google OAuth"
# Convención de commits: feat / fix / chore / docs / refactor / test / style
# Commits adicionales en la misma rama
git add src/auth/google.ts
git commit -m "feat: añadir callback handler para OAuth"
# 4. Subir la rama al remoto
git push origin feature/login-con-google
git push -u origin feature/login-con-google # -u para trackear automáticamente
Pull Request y review
# Mantener la rama actualizada con main durante la review
git fetch origin
git rebase origin/main # rebase sobre main actualizado (alternativa a merge)
# o
git merge origin/main # merge de main en la rama feature
# Si hay conflictos
git status # ver archivos en conflicto
# editar los archivos, resolver los marcadores <<<< ==== >>>>
git add archivo-resuelto.ts
git rebase --continue # si estabas en rebase
git commit # si estabas en merge
# Actualizar el PR
git push origin feature/login-con-google
git push --force-with-lease # si hiciste rebase (no force a secas)
Después del merge: limpiar
# Volver a main y actualizar
git switch main
git pull origin main
# Eliminar la rama local (ya está en main)
git branch -d feature/login-con-google
# Eliminar la rama remota (si no lo hizo GitHub automáticamente)
git push origin --delete feature/login-con-google
# Ver ramas locales
git branch
# Ver ramas remotas
git branch -r
# Limpiar referencias a ramas remotas ya eliminadas
git remote prune origin
Deshacer cosas
# Deshacer cambios en el working tree (no staged)
git restore archivo.ts
# Deshacer git add (sacar del stage)
git restore --staged archivo.ts
# Modificar el último commit (mensaje o añadir archivo olvidado)
git add archivo-olvidado.ts
git commit --amend --no-edit # mismos cambios, mantiene el mensaje
git commit --amend -m "nuevo mensaje"
# Solo seguro si aún no has hecho push
# Deshacer el último commit pero mantener los cambios
git reset HEAD~1 # soft: cambios quedan en stage
git reset --mixed HEAD~1 # mixed (default): en working tree
git reset --hard HEAD~1 # hard: DESCARTA los cambios
# Revertir un commit ya publicado (crea commit inverso)
git revert abc1234
git revert HEAD~2..HEAD # revertir los últimos 2 commits
Inspeccionar el historial
git log # historial completo
git log --oneline # una línea por commit
git log --oneline --graph # con árbol de ramas
git log --oneline -10 # últimos 10 commits
git log --author="Yassin" --since="1 week ago"
git log -- archivo.ts # historial de un archivo
git show abc1234 # ver un commit concreto
git diff main..feature/mi-rama # diferencias entre ramas
git blame archivo.ts # ver quién escribió cada línea
Stash: guardar cambios temporalmente
git stash # guardar cambios sin commitear
git stash push -m "WIP: login form" # con mensaje descriptivo
git stash list # ver todos los stashes
git stash pop # aplicar el último y eliminarlo
git stash apply stash@{1} # aplicar uno concreto sin eliminarlo
git stash drop stash@{1} # eliminar uno concreto
git stash clear # eliminar todos