git commit
Registrar cambios en el repositorio
El comando 'git commit' crea un commit nuevo con el contenido actual del índice (área de preparación) y un mensaje que describe los cambios. El commit nuevo es hijo directo de HEAD y pasa a ser la nueva punta de la rama actual. Cada commit es una instantánea permanente del historial del proyecto que puedes volver a ver, comparar o restaurar en cualquier momento.
Sinopsis
git commit [-a] [-m <msg>] [--amend] [--no-edit] [-v] [-n] [--dry-run] [-s] [-S] [--] [<pathspec>...]Opciones
Elegir la opción adecuada
Opciones del mensaje
Distintas formas de indicar o editar el mensaje del commit
| Comando | Origen | Abre el editor | Caso de uso |
|---|---|---|---|
git commit -m "msg" | En línea | ✗ | Commits rápidos con mensajes cortos |
git commit -F file | Archivo | ✗ | Mensaje ya escrito en un archivo |
git commit -t file | Plantilla | ✓ | Empezar con una plantilla en el editor |
git commit -e | Editor | ✓ | Forzar el editor incluso con -m |
git commit -C <commit> | Copiar | ✗ | Reutilizar el mensaje de otro commit |
git commit -c <commit> | Copiar + editar | ✓ | Editar el mensaje de otro commit |
Limpieza del mensaje
Cómo se procesa el mensaje antes de guardarlo
| Comando | Modo | Quita comentarios | Quita espacios | Ideal para |
|---|---|---|---|---|
--cleanup=strip | strip | ✓ | ✓ | La mayoría de commits |
--cleanup=whitespace | Espacios | ✗ | ✓ | Conservar los comentarios # |
--cleanup=verbatim | Literal | ✗ | ✗ | Conservar el mensaje tal cual |
--cleanup=scissors | Tijeras | Solo por debajo de la línea de tijeras | ✓ | Conservar las líneas # al usar el editor |
Autor y fecha
Cambiar quién hizo el commit y cuándo
| Comando | Sustituye | Formato | Uso típico |
|---|---|---|---|
--author="Name <email>" | Autor | Nombre <email> | Hacer commit en nombre de otra persona |
--date="date" | Fecha de autoría | ISO 8601 / relativa | Poner fechas pasadas a los commits |
--reset-author | Ambos | Usuario/hora actuales | Asumir la autoría de un parche aplicado |
Amend y corrección del historial
Opciones para modificar commits existentes
| Comando | Crea | Modifica HEAD | Usar con |
|---|---|---|---|
git commit --amend | Sustitución | ✓ | Corregir el mensaje o el contenido del último commit |
git commit --fixup=<sha> | commit fixup! | ✗ | git rebase -i --autosquash |
git commit --squash=<sha> | commit squash! | ✗ | git rebase -i --autosquash |
Qué entra en el commit
Controlar qué archivos se incluyen en el commit
| Comando | Prepara antes | Commits | Directorio de trabajo |
|---|---|---|---|
git commit | ✗ | Solo lo preparado | Sin cambios |
git commit -a | Archivos con seguimiento | Todos los que tienen seguimiento | Sin cambios |
git commit -i <file> | Indicados | Preparado + archivo | Sin cambios |
git commit -o <file> | Solo los indicados | Solo el archivo | Los demás preparados, excluidos |
git commit -p | Interactivo | Fragmentos elegidos | Sin cambios |
Firma GPG
Firmar commits criptográficamente para poder verificarlos
| Comando | Acción | Clave usada | Cuándo usarla |
|---|---|---|---|
git commit -S | Firmar | Clave GPG por defecto | Demostrar la autenticidad del commit |
git commit -S<keyid> | Firmar | Clave concreta | Usar otra clave de firma |
git commit --no-gpg-sign | No firmar | Ninguno | Anular commit.gpgSign=true |
Control de hooks
Saltarse o controlar los hooks pre-commit y post-commit
| Comando | Se salta | Nivel de riesgo | Cuándo usarla |
|---|---|---|---|
git commit --no-verify | pre-commit + commit-msg | Media | Arreglo urgente, reparar los hooks después |
git commit --no-post-rewrite | post-rewrite | Bajo | Saltarse el procesamiento lento tras un amend |
Dry-run y formato de salida
Ver qué entraría en el commit sin hacerlo
| Comando | Formato | Analizable | Muestra |
|---|---|---|---|
--dry-run | Largo (por defecto) | ✗ | Estado completo con pistas |
--dry-run --short | Corto | ✓ | Códigos de estado compactos |
--dry-run --porcelain | Porcelain | ✓ | Formato estable para scripts |
--dry-run --branch | Con la rama | ✓ | Añade información de seguimiento al formato corto |
--dry-run -z | Separado por NUL | ✓ | Seguro con nombres de archivo especiales |
Estado mostrado en el editor
Controlar qué aparece en el editor al escribir el mensaje
| Comando | En el editor | Efecto |
|---|---|---|
git commit --status | Estado como comentarios | Ver los archivos del commit (por defecto) |
git commit --no-status | Sin lista de archivos | Editor más limpio, menos distracciones |
git commit -v | Diff completo | Revisar los cambios exactos mientras escribes |
git commit -q | Editor normal | Ocultar el resumen tras el commit |
Commits especiales
Crear commits en situaciones poco habituales
| Comando | Permite | Crea commit | Caso de uso |
|---|---|---|---|
--allow-empty | Sin cambios | ✓ | Disparadores de CI, marcas de rama |
--allow-empty-message | Sin mensaje | ✓ | Scripts automáticos (no recomendado) |
--trailer "Key: value" | Metadatos | ✓ | Co-authored-by, Fixes, Reviewed-by |
Ejemplos de flujos de trabajo
git add .Preparar tus cambios
git commit -m "Fix typo in README"Hacer commit con un mensaje corto
git add -APreparar todos los cambios
git commitAbre el editor para un mensaje de varias líneas
(Write: subject line, blank line, detailed body)Seguir la regla 50/72 de formato
git add forgotten-file.jsPreparar el archivo olvidado
git commit --amend --no-editAñadirlo al último commit sin cambiar el mensaje
git commit --amend -m "Corrected message"Sustituir el último commit con un mensaje nuevo
git commit -a -m "Update config files"Preparar automáticamente los archivos con seguimiento modificados/borrados y hacer commit
git add .Preparar los cambios
git commit -S -m "Verified security patch"Crear un commit firmado con GPG
Teclas del editor y del modo interactivo
Atajos de teclado cuando Git abre un editor para el mensaje del commit o cuando usas modos interactivos.
Vim (por defecto en muchos sistemas)
core.editor = vimNano
core.editor = nanoVS Code
core.editor = "code --wait"Modo patch (-p)
git commit -pSolución de problemas
no changes added to commit (use "git add" and/or "git commit -a")
Causa: Hay archivos cambiados pero nada preparado: olvidaste ejecutar 'git add'. (Si ves 'nothing to commit, working tree clean', no hay ningún cambio.)
Prepara los cambios con 'git add' antes del commit. Usa 'git status' para ver qué hay que preparar.
git add . && git commit -m "message"Please tell me who you are (Author identity unknown)
Causa: Git exige tener configurados user.name y user.email antes de tu primer commit.
Configura tu identidad de forma global o para este repositorio.
git config --global user.name "Your Name" && git config --global user.email "you@example.com"Aborting commit due to empty commit message
Causa: Cerraste el editor sin escribir un mensaje, o el mensaje solo tenía comentarios.
Escribe un mensaje de commit en el editor o usa la opción '-m' para un mensaje en línea.
git commit -m "Your message here"Falló el hook pre-commit
Causa: Un hook pre-commit (lint, tests, formato) encontró problemas y bloqueó el commit.
Arregla los problemas que indica el hook. Sáltatelo con '--no-verify' solo si es absolutamente necesario.
git commit --no-verify -m "message"Falló el hook commit-msg
Causa: Tu mensaje de commit no sigue el formato que exigen las convenciones del proyecto.
Sigue la convención de mensajes de commit de tu proyecto (p. ej., el formato Conventional Commits).
git commit -m "feat: add new feature"Changes not staged for commit
Causa: Has modificado archivos pero no los has añadido al área de preparación.
Usa 'git add' para preparar archivos concretos, o 'git commit -a' para preparar automáticamente los archivos con seguimiento.
git add <file> && git commit -m "message"error: failed to push some refs (tras un amend)
Causa: Hiciste amend de un commit que ya estaba subido y el historial ha divergido.
Haz force push (si eres la única persona en la rama) o haz un revert y crea un commit nuevo.
git push --force-with-leaseYour branch is ahead of 'origin/main' by X commits
Causa: Tienes commits locales que aún no se han subido.
¡Es normal! Sube cuando estés listo o sigue trabajando en local.
git push origin mainConsejos y trampas
Buenas prácticas
- ✓Escribe mensajes de commit claros: empieza con un verbo (Add, Fix, Update, Remove) y mantén el asunto por debajo de 50 caracteres.
- ✓Usa el modo imperativo: escribe 'Add feature' y no 'Added feature'; imagina que completas «This commit will...»
- ✓Haz commits atómicos: cada commit debe representar un único cambio lógico. No mezcles arreglos de bugs con funcionalidades nuevas.
- ✓Revisa antes del commit: usa 'git diff --staged' para ver exactamente lo que vas a incluir.
- ✓Nunca hagas amend de commits ya subidos: amend reescribe el historial. Solo modifica commits que no se hayan compartido.
- ✓Separa el asunto del cuerpo con una línea en blanco: en mensajes largos, la primera línea es el asunto, luego una línea en blanco y después los detalles.
- ✓Ajusta el cuerpo a 72 caracteres: así se lee bien en las terminales y en la salida de git log.
- ✓Menciona los números de incidencia: incluye 'Fixes #123' o 'Closes #456' para enlazar los commits con el seguimiento de incidencias.
- ✓Haz commits a menudo y push con menos frecuencia: los commits pequeños y frecuentes son más fáciles de revisar y revertir que los grandes.
- ✓No hagas commit de archivos generados: deja fuera los artefactos de build, las dependencias (node_modules) y los archivos compilados.
Errores comunes
- ✗Ejecutar 'git commit' sin haber preparado cambios: primero tienes que usar 'git add', salvo con 'git commit -a', que solo prepara archivos con seguimiento.
- ✗Escribir mensajes vagos como 'fix' o 'update': usa mensajes claros y descriptivos que expliquen POR QUÉ se hizo el cambio.
- ✗Incluir demasiados cambios sin relación en un solo commit: haz commits atómicos, un cambio lógico por commit, para facilitar la revisión y la reversión.
- ✗Usar --amend en commits ya subidos a ramas compartidas: amend reescribe el historial y causará problemas a los demás.
- ✗Olvidar configurar user.name y user.email: Git exige la identidad del autor antes de tu primer commit.
Preguntas frecuentes
'git commit' solo incluye lo que hay en el área de preparación. 'git commit -a' prepara automáticamente todos los archivos con seguimiento modificados o borrados antes del commit, pero NO los archivos nuevos sin seguimiento. Para los archivos nuevos sigues necesitando 'git add'.
Para commits sin subir: 'git reset --soft HEAD~1' conserva los cambios preparados, 'git reset HEAD~1' (igual que --mixed) los quita de la preparación y 'git reset --hard HEAD~1' los descarta. Para commits ya subidos: usa 'git revert HEAD' para crear un commit nuevo que deshaga los cambios.
Para el último commit: 'git commit --amend -m "New message"'. Para commits anteriores: usa 'git rebase -i' y cambia 'pick' por 'reword'. Nunca lo hagas con commits ya subidos a ramas compartidas.
Git abre el editor que tengas configurado para escribir un mensaje. Si lo cierras sin guardar ningún mensaje, el commit se cancela. Usa '-m' para un mensaje en línea o '--allow-empty-message' para hacer commit sin mensaje (no recomendado).
Prepara los archivos extra con 'git add <file>' y luego ejecuta 'git commit --amend --no-edit'. Se añaden al commit anterior sin cambiar su mensaje.
'--amend' sustituye por completo el último commit (¡hash nuevo!). Úsalo para corregir erratas en el mensaje o añadir archivos olvidados. Nunca lo uses en commits ya subidos a ramas compartidas: reescribe el historial.
Usa varias opciones -m: 'git commit -m "Subject" -m "Body paragraph"'. Cada -m crea un párrafo nuevo. O simplemente ejecuta 'git commit' para abrir tu editor.
Mantén la línea de asunto por debajo de 50 caracteres (límite estricto 72). Ajusta el cuerpo a 72 caracteres. Así se lee bien en la terminal, en git log y en las interfaces de GitHub/GitLab.
Usa 'git commit --no-verify' o '-n'. Se saltan los hooks pre-commit y commit-msg. Úsalo con moderación: los hooks existen para mantener la calidad del código.
Sí, usa 'git commit --allow-empty -m "message"'. Útil para disparar pipelines de CI/CD o marcar hitos en el historial sin cambiar el código.