Guía Visual de Git

Todos los comandos y configuraciones con ejemplos prácticos

⚙️

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.

--system Todo el sistema
/etc/gitconfig
--global Usuario actual
~/.gitconfig
--local Repositorio actual
.git/config
⬆️ Mayor prioridad
config

Identidad

# Nombre y email del autor de commits
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"
config

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
config

Rama por defecto

# Nombrar la rama inicial como "main"
git config --global init.defaultBranch main
config

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
config

Colores en la terminal

# Activa colores automáticamente
git config --global color.ui auto
config

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

init

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
📁 Crea una carpeta oculta .git/ que contiene toda la historia del repositorio.
clone

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
☁️ Remoto
(GitHub)
git clone ──▶
💻 Local
(copia completa)
──▶ git init
✨ Nuevo
repositorio
🔍

Estado e Historial

status

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
log

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"
diff

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
show

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

* a3f1b2c (HEAD → main) Fix: corrige error de login
* 8d4e901 Añade validación de formulario
| * c12f3a8 (feature/dashboard) UI: nuevo panel
| * 79b2d41 Agrega componente Card
|/
* 4a8c990 (origin/main) Commit inicial
📦

Área de Staging (Index)

Working Directory
📝
Archivos que estás editando ahora mismo
git add ──▶
◀── git restore
Staging Area (Index)
📦
Cambios preparados para el próximo commit
git commit ──▶
◀── git reset
Repositorio (.git)
🗄️
Historia permanente de commits
add

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
restore

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
rm / mv

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

Reset al staging

# Quitar un archivo del staging
git reset HEAD archivo.txt

# (equivalente moderno)
git restore --staged archivo.txt
💾

Commits

commit

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"
amend

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
⚠️ Solo usar --amend en commits que no se han publicado en el remoto.
reset

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.
revert

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 Nueva funcionalidad
fix Corrección de bug
docs Solo documentación
style Formato, sin lógica
refactor Refactorización
test Añadir o corregir tests
chore Tareas de mantenimiento
BREAKING Cambio incompatible
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

Commit
ABC
--soft mueve HEAD aquí
Staging conservado
◀ HEAD~1
Staging
(Index)
--mixed además limpia staging
Working
Directory
--hard además descarta archivos
🌿

Ramas (Branches)

branch

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
switch / checkout

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 -
worktree

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
💡 Permite trabajar en 2 ramas simultáneamente sin hacer stash.
🔀

Merge y Rebase

Antes

A
B
C
main
X
Y
feature

Después de merge

A
B
C
M
main (merge commit)
X
Y
↗️

Después de rebase

A
B
C
X'
Y'
historial lineal
merge

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

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
⚠️ No hacer rebase en ramas publicadas compartidas (reescribe historial).
conflictos

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

☁️
origin (GitHub / GitLab)
main develop
git fetch / git pull ⬇️
⬆️ git push
💻
Local
origin/main origin/develop main
remote

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

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

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

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
🏷️

Etiquetas (Tags)

tag ligero

Tags ligeros

# Crear tag ligero en HEAD
git tag v1.0.0

# Tag en un commit específico
git tag v1.0.0 abc1234

# Listar tags
git tag
git tag -l "v1.*"
tag anotado

Tags anotados (recomendados)

# Tag anotado con mensaje
git tag -a v1.0.0 -m "Release versión 1.0.0"

# Ver información del tag
git show v1.0.0

# Subir tags al remoto
git push origin v1.0.0
git push origin --tags

# Eliminar tag local
git tag -d v1.0.0

# Eliminar tag remoto
git push origin --delete v1.0.0
Ligero vs Anotado: Un tag ligero es solo un puntero a un commit. Un tag anotado almacena autor, fecha, mensaje y puede firmarse con GPG.
🗃️

Stash (Almacén temporal)

Guarda cambios temporalmente sin hacer commit, ideal para cambiar de rama rápidamente.

Working Dir
con cambios
git stash ──▶
stash@{0}
stash@{1}
...
◀── git stash pop
Working Dir
restaurado
stash

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

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

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}
🆘 El reflog es tu red de seguridad: puedes recuperar casi cualquier cosa.
bisect

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
clean

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.
submodule

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
archive

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

v1.0 ✅
c2
c3
c4 ❓
c5
c6
HEAD ❌

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.

Sintaxis

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
Plantilla

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/
🌍
Global .gitignore
git config --global core.excludesfile ~/.gitignore_global

Para ignorar archivos de editor/OS en todos tus proyectos.

🔧
Dejar de rastrear archivo ya commiteado
git rm --cached archivo.txt
# Luego añadirlo al .gitignore
🔍
Verificar si un archivo está ignorado
git check-ignore -v archivo.txt

Alias

Crea atajos para comandos largos o frecuentes.

alias

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"
uso

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
Alias
Comando completo
Descripción
git st
git status
Estado del repo
git co
git checkout
Cambiar rama/archivo
git br
git branch
Listar ramas
git lg
git log --oneline --graph --all
Log visual
git undo
git reset --soft HEAD~1
Deshacer último commit
git last
git log -1 HEAD --stat
Ver último commit
📋

Cheatsheet Rápido

Configuración

git config --global user.name
git config --list

Inicio

git init
git clone URL

Cambios

git status
git add .
git commit -m "msg"
git diff

Ramas

git branch
git switch -c rama
git merge rama
git rebase main

Remotos

git remote -v
git fetch
git pull
git push -u origin main

Deshacer

git restore archivo
git reset --soft HEAD~1
git revert abc1234
git reflog

Historial

git log --oneline
git log --graph --all
git blame archivo
git show abc1234

Utilidades

git stash
git tag v1.0.0
git cherry-pick
git bisect