Configuración git config
La configuración de Git tiene tres niveles: sistema, global (usuario) y local (repositorio). La más específica sobreescribe a la más general.
/etc/gitconfig
~/.gitconfig
.git/config
Identidad
# Nombre y email del autor de commits
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"
Editor y herramientas
# Establecer editor por defecto
git config --global core.editor "code --wait"
# Herramienta de diff visual
git config --global diff.tool vscode
git config --global merge.tool vscode
Rama por defecto
# Nombrar la rama inicial como "main"
git config --global init.defaultBranch main
Saltos de línea (CRLF)
# Windows: auto-convierte CRLF ↔ LF
git config --global core.autocrlf true
# Linux/Mac: solo normaliza al hacer commit
git config --global core.autocrlf input
Colores en la terminal
# Activa colores automáticamente
git config --global color.ui auto
Listar y eliminar config
# Ver toda la configuración
git config --list
# Ver un valor específico
git config user.name
# Eliminar una clave
git config --global --unset user.name
Inicio de repositorio
Crear repositorio local
# Inicializa un nuevo repositorio en la carpeta actual
git init
# Inicializa con un nombre de carpeta específico
git init mi-proyecto
# Repositorio bare (sin working directory, para servidores)
git init --bare mi-proyecto.git
.git/ que contiene toda la
historia del repositorio.
Clonar repositorio existente
# Clonar por HTTPS
git clone https://github.com/usuario/repo.git
# Clonar por SSH
git clone git@github.com:usuario/repo.git
# Clonar en una carpeta con nombre personalizado
git clone https://github.com/usuario/repo.git mi-carpeta
# Clonar solo una rama específica
git clone -b develop --single-branch https://github.com/usuario/repo.git
# Clonar con profundidad limitada (shallow clone)
git clone --depth 1 https://github.com/usuario/repo.git
(GitHub)
(copia completa)
repositorio
Estado e Historial
Estado del repositorio
# Ver estado completo
git status
# Formato corto/compacto
git status -s
git status --short
| M | Modificado (staged) |
| M | Modificado (no staged) |
| A | Añadido al staging |
| ? | Sin rastrear (untracked) |
| D | Eliminado |
Historial de commits
# Historial completo
git log
# Compacto, una línea por commit
git log --oneline
# Gráfico de ramas en terminal
git log --oneline --graph --all --decorate
# Últimos N commits
git log -5
# Log de un archivo específico
git log -- archivo.txt
# Buscar en mensajes de commits
git log --grep="fix"
Ver diferencias
# Cambios no añadidos al staging
git diff
# Cambios en el staging (vs último commit)
git diff --staged
git diff --cached
# Diferencia entre dos commits
git diff abc123 def456
# Diferencia entre dos ramas
git diff main..feature/login
# Solo nombres de archivos cambiados
git diff --name-only
Inspeccionar objetos
# Ver detalles de un commit
git show abc1234
# Ver un archivo en un commit concreto
git show abc1234:ruta/archivo.txt
# Quién modificó cada línea
git blame archivo.txt
# Con rangos de líneas
git blame -L 10,20 archivo.txt
Ejemplo: git log --oneline --graph --all
Área de Staging (Index)
Añadir al staging
# Añadir un archivo específico
git add archivo.txt
# Añadir todos los archivos
git add .
git add -A
# Añadir archivos de un tipo
git add *.js
# Modo interactivo: elegir partes del archivo
git add -p archivo.txt
git add --patch archivo.txt
Deshacer cambios
# Descartar cambios en working dir
git restore archivo.txt
# Sacar del staging (quitar del index)
git restore --staged archivo.txt
# Restaurar a versión de un commit
git restore --source=HEAD~2 archivo.txt
Eliminar y mover archivos
# Eliminar archivo del repo y disco
git rm archivo.txt
# Dejar de rastrear (mantener en disco)
git rm --cached archivo.txt
# Mover / renombrar archivo
git mv viejo.txt nuevo.txt
Reset al staging
# Quitar un archivo del staging
git reset HEAD archivo.txt
# (equivalente moderno)
git restore --staged archivo.txt
Commits
Crear commits
# Commit con mensaje en línea
git commit -m "feat: agrega módulo de login"
# Abre el editor para mensaje largo
git commit
# Añade todos los tracked + commit
git commit -am "fix: corrige error de validación"
Modificar último commit
# Cambiar el mensaje del último commit
git commit --amend -m "Nuevo mensaje"
# Añadir cambios olvidados al último commit
git add archivo-olvidado.txt
git commit --amend --no-edit
--amend en commits que
no se han publicado en el remoto.
Deshacer commits
# Soft: deshace commit, conserva staging
git reset --soft HEAD~1
# Mixed (default): deshace commit y staging
git reset HEAD~1
git reset --mixed HEAD~1
# Hard: deshace commit, staging y archivos
git reset --hard HEAD~1
--hard es destructivo: pierdes cambios en
archivos.
Revertir commit (seguro)
# Crea un nuevo commit que deshace el efecto
git revert abc1234
# Sin abrir editor (mensaje automático)
git revert abc1234 --no-edit
# Revertir varios commits
git revert HEAD~3..HEAD
revert es seguro para ramas publicadas porque no
reescribe historial.
📐 Convención: Conventional Commits
feat(auth): agrega login con Google OAuth
fix(api): corrige respuesta 500 en /users endpoint
docs: actualiza README con instrucciones de instalación
Diagrama: git reset niveles
ABC
Staging conservado
(Index)
Directory
Ramas (Branches)
Gestionar ramas
# Listar ramas locales
git branch
# Listar todas (locales + remotas)
git branch -a
# Crear una nueva rama
git branch feature/login
# Crear desde un commit específico
git branch hotfix/bug abc1234
# Renombrar rama actual
git branch -m nuevo-nombre
# Eliminar rama (si ya está merged)
git branch -d feature/login
# Forzar eliminación
git branch -D feature/login
Cambiar de rama
# Cambiar a una rama existente (moderno)
git switch develop
# Crear y cambiar a la vez (moderno)
git switch -c feature/nuevo-panel
# Equivalente clásico
git checkout develop
git checkout -b feature/nuevo-panel
# Volver a la rama anterior
git switch -
git checkout -
Múltiples worktrees
# Tener dos ramas abiertas a la vez en carpetas separadas
git worktree add ../proyecto-hotfix hotfix/urgente
# Listar worktrees activos
git worktree list
# Eliminar worktree
git worktree remove ../proyecto-hotfix
Merge y Rebase
Antes
Después de merge
Después de rebase
Fusionar ramas
# Desde main, traer feature/login
git switch main
git merge feature/login
# Siempre crear merge commit (no fast-forward)
git merge --no-ff feature/login
# Squash: aplasta commits en uno
git merge --squash feature/login
# Abortar merge en conflicto
git merge --abort
Rebase
# Rebasar feature sobre main
git switch feature/login
git rebase main
# Rebase interactivo (editar historial)
git rebase -i HEAD~3
# Continuar después de resolver conflicto
git rebase --continue
# Abortar rebase
git rebase --abort
Resolver conflictos
# 1. Identificar archivos en conflicto
git status
# El archivo tendrá marcadores:
<<<<<<< HEAD
console.log("versión de main")
=======
console.log("versión de feature")
>>>>>>> feature/login
# 2. Editar el archivo y dejar la versión correcta
# 3. Marcar como resuelto
git add archivo-conflicto.txt
# 4. Continuar merge/rebase
git commit # (para merge)
git rebase --continue # (para rebase)
Repositorios Remotos
Gestionar remotos
# Ver remotos configurados
git remote -v
# Añadir remoto
git remote add origin https://github.com/u/repo.git
# Cambiar URL de un remoto
git remote set-url origin git@github.com:u/repo.git
# Renombrar remoto
git remote rename origin upstream
# Eliminar remoto
git remote remove upstream
Fetch (descargar sin integrar)
# Descargar todos los cambios del remoto
git fetch
# Fetch de un remoto específico
git fetch origin
# Fetch de una rama específica
git fetch origin main
# Eliminar ramas remotas eliminadas
git fetch --prune
git fetch -p
fetch descarga cambios pero
no modifica tu rama local.
Pull (fetch + merge)
# Traer y fusionar rama remota
git pull
# Pull con rebase en lugar de merge
git pull --rebase
# De una rama específica
git pull origin main
# Configurar pull --rebase por defecto
git config --global pull.rebase true
Push (subir cambios)
# Subir rama actual
git push
# Primera vez: asociar y subir
git push -u origin main
git push --set-upstream origin feature/login
# Subir todos los tags
git push --tags
# Eliminar rama remota
git push origin --delete feature/login
# Forzar push (¡peligroso!)
git push --force-with-lease # recomendado
git push -f # peligroso
Stash (Almacén temporal)
Guarda cambios temporalmente sin hacer commit, ideal para cambiar de rama rápidamente.
con cambios
stash@{1}
...
restaurado
Comandos de stash
# Guardar cambios en el stash
git stash
git stash push
# Guardar con mensaje descriptivo
git stash push -m "trabajo en progreso: diseño header"
# Incluir archivos sin rastrear
git stash push -u
git stash push --include-untracked
# Ver lista de stashes
git stash list
# Aplicar el stash más reciente (y eliminarlo)
git stash pop
# Aplicar sin eliminar del stash
git stash apply stash@{0}
# Ver qué hay en un stash
git stash show -p stash@{0}
# Crear una rama desde un stash
git stash branch nueva-rama stash@{0}
# Eliminar un stash
git stash drop stash@{0}
# Limpiar todos los stashes
git stash clear
Comandos Avanzados
Cherry-pick
Aplica un commit específico de otra rama.
# Traer un commit específico
git cherry-pick abc1234
# Traer un rango de commits
git cherry-pick abc1234..def5678
# Sin hacer commit automático
git cherry-pick -n abc1234
# Abortar
git cherry-pick --abort
Reflog (historial de movimientos)
Registro de todos los movimientos de HEAD, incluso los "perdidos".
# Ver historial del HEAD
git reflog
# Ver reflog de una rama
git reflog show feature/login
# Recuperar commit "perdido" con reset --hard
git reset --hard HEAD@{3}
Bisect (encontrar bug)
Búsqueda binaria para encontrar el commit que introduce un bug.
# Iniciar bisect
git bisect start
# Marcar commit actual como malo
git bisect bad
# Marcar commit bueno conocido
git bisect good v1.0.0
# Git hace checkout automático al punto medio
# Prueba y marca cada uno:
git bisect good # o
git bisect bad
# Terminar y volver a HEAD
git bisect reset
Limpiar archivos sin rastrear
# Ver qué se eliminaría (dry-run)
git clean -n
git clean --dry-run
# Eliminar archivos sin rastrear
git clean -f
# Eliminar también directorios
git clean -fd
# Eliminar también archivos ignorados
git clean -fdx
git clean -f es irreversible. Usar
-n antes.
Submódulos
# Añadir submódulo
git submodule add https://github.com/u/lib.git
# Clonar repo con submódulos
git clone --recurse-submodules URL
# Inicializar submódulos después de clonar
git submodule init
git submodule update
# Actualizar submódulos
git submodule update --remote
Exportar y archivar
# Exportar snapshot del proyecto como ZIP
git archive --format=zip HEAD > proyecto.zip
# Exportar una rama específica
git archive --format=tar.gz main > proyecto.tar.gz
# Contar objetos y verificar integridad
git fsck
git count-objects -vH
Cómo funciona git bisect
Git hace checkout al commit del medio (c4). Si está bien → busca entre c5-HEAD. Si está mal → busca entre v1.0-c4.
.gitignore
Indica a Git qué archivos y carpetas nunca deben ser rastreados.
Patrones de .gitignore
# Comentario: ignorar archivos .log
*.log
# Ignorar carpeta completa
node_modules/
dist/
build/
# Ignorar solo en la raíz del proyecto
/error.log
# Ignorar en cualquier subdirectorio
**/temp
# Ignorar todos los .txt excepto important.txt
*.txt
!important.txt
# Ignorar archivos dentro de una carpeta
logs/*.log
# Ignorar archivos en subcarpetas también
logs/**/*.log
Ejemplo completo para proyecto Node.js
# Dependencias
node_modules/
.pnp
.pnp.js
# Build
dist/
build/
.next/
out/
# Variables de entorno
.env
.env.local
.env.production
# Logs
npm-debug.log*
yarn-error.log
# Editor
.vscode/
.idea/
*.swp
# Sistema
.DS_Store
Thumbs.db
desktop.ini
# Tests / cobertura
coverage/
.nyc_output/
git config --global core.excludesfile ~/.gitignore_global
Para ignorar archivos de editor/OS en todos tus proyectos.
git rm --cached archivo.txt
# Luego añadirlo al .gitignore
git check-ignore -v archivo.txt
Alias
Crea atajos para comandos largos o frecuentes.
Crear y usar alias
# Formato: git config --global alias.ATAJO "COMANDO"
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
# Alias con opciones complejas
git config --global alias.lg "log --oneline --graph --all --decorate"
# Alias para deshacer último commit
git config --global alias.undo "reset --soft HEAD~1"
# Alias para listar alias
git config --global alias.aliases "config --get-regexp alias"
# Alias para último commit
git config --global alias.last "log -1 HEAD --stat"
Usando los alias
# En lugar de:
git status → git st
git checkout develop → git co develop
git branch → git br
git commit -m "msg" → git ci -m "msg"
git log --oneline --graph --all --decorate → git lg
git stgit statusgit cogit checkoutgit brgit branchgit lggit log --oneline --graph --allgit undogit reset --soft HEAD~1git lastgit log -1 HEAD --statCheatsheet Rápido
Configuración
git config --global user.name
git config --listInicio
git initgit clone URLCambios
git statusgit add .git commit -m "msg"git diffRamas
git branchgit switch -c ramagit merge ramagit rebase mainRemotos
git remote -vgit fetchgit pullgit push -u origin mainDeshacer
git restore archivogit reset --soft HEAD~1git revert abc1234git reflogHistorial
git log --onelinegit log --graph --allgit blame archivogit show abc1234Utilidades
git stashgit tag v1.0.0git cherry-pickgit bisect