git commit

Instantáneas básicas

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>...]
[ ] opcional| o<arg> valor a sustituir... repetible--flag opción

Opciones

Haz clic en una opción para desplegarla

Principiante (8)

Usar el mensaje indicado como mensaje del commit. Puede repetirse para mensajes de varios párrafos.

RecomendadoBien para mensajes cortos; usa el editor para asunto y cuerpo

Ejemplo

git commit -m "Add login feature"

Preparar automáticamente todos los archivos con seguimiento modificados y borrados antes del commit. NO añade archivos nuevos sin seguimiento.

Cuando haga faltaSe salta la revisión de la preparación y nunca incluye archivos nuevos sin seguimiento

Ejemplo

git commit -a -m "Update all config files"

Sustituir la punta de la rama actual por un commit nuevo. Sirve para corregir el mensaje del último commit o añadir archivos olvidados. Crea un hash de commit nuevo.

Cuando haga faltaSeguro en commits sin subir; reescribe el historial si ya se subieron

Ejemplo

git commit --amend -m "Fixed message"

Mostrar el diff de los cambios preparados en la plantilla del mensaje. Te ayuda a revisar lo que incluyes mientras escribes el mensaje.

RecomendadoMuestra el diff mientras escribes el mensaje

Ejemplo

git commit -v

Ver qué entraría en el commit sin crearlo. Ideal para comprobarlo antes.

Cuando haga faltaPrevisualiza lo que se confirmaría sin hacer el commit

Ejemplo

git commit --dry-run

Ocultar el resumen del commit con los archivos cambiados y las inserciones/borrados.

Cuando haga faltaSuprime el resumen del commit, sobre todo para scripts

Ejemplo

git commit -q -m "Silent commit"

Abrir el editor para el mensaje aunque uses -m, -F o -C. Te permite seguir editando el mensaje.

Cuando haga faltaAbre el editor aunque -m, -F o -C ya hayan dado un mensaje

Ejemplo

git commit -m "Initial message" -e

Usar el mensaje de commit elegido sin abrir el editor. Se suele combinar con --amend para añadir archivos sin cambiar el mensaje.

Cuando haga faltaReutiliza el mensaje existente, normalmente junto con --amend

Ejemplo

git commit --amend --no-edit

Intermedio (10)

Leer el mensaje del commit desde el archivo indicado. Usa '-' para leer de la entrada estándar.

Cuando haga faltaToma el mensaje de un archivo o de stdin: para scripts y mensajes largos

Ejemplo

git commit -F commit-message.txt

Abrir el editor del mensaje con el contenido del archivo indicado (commit.template lo fija por defecto). Si dejas la plantilla sin cambios, el commit se cancela; no tiene efecto cuando -m o -F aportan el mensaje.

Cuando haga faltaParte de una plantilla de mensaje de commit del equipo

Ejemplo

git commit -t .gitmessage

Tomar un objeto commit existente y reutilizar su mensaje y su información de autoría (incluida la fecha) al crear el commit.

Cuando haga faltaReutiliza tal cual el mensaje y la autoría de otro commit

Ejemplo

git commit -C HEAD~1

Como -C, pero abre el editor para que edites el mensaje. Reutiliza la información de autoría pero te deja cambiar el texto.

Cuando haga faltaParte del mensaje de otro commit y te deja editarlo

Ejemplo

git commit -c HEAD~1

Preparar las rutas indicadas además de lo que ya está preparado y luego hacer commit de todo. La documentación oficial advierte que normalmente no es lo que quieres, salvo para terminar un merge con conflictos.

Cuando haga faltaPrepara las rutas indicadas además de lo que ya está preparado

Ejemplo

git commit -i extra-file.js -m "Include additional file"

Hacer commit solo del contenido del árbol de trabajo de los archivos indicados; los demás cambios preparados siguen preparados para más adelante. Es el comportamiento por defecto al indicar rutas.

Cuando haga faltaConfirma solo las rutas indicadas: ya es lo predeterminado cuando se dan rutas

Ejemplo

git commit -o urgent-fix.js -m "Hotfix"

Usar la interfaz interactiva de selección de parches para elegir qué cambios incluir. Te permite hacer commit de partes de archivos.

RecomendadoElegir hunks y confirmarlos en un paso

Ejemplo

git commit -p

Añadir un trailer Signed-off-by al final del mensaje del commit. Certifica que tienes derecho a enviar el código (Developer Certificate of Origin).

Cuando haga faltaAñádela cuando el proyecto exija la firma DCO

Ejemplo

git commit -s -m "Add feature"

Desactivar el trailer Signed-off-by. Anula un --signoff anterior en la línea de comandos (p. ej., de un alias).

Cuando haga faltaAnula un --signoff anterior en la misma línea de comandos

Ejemplo

git commit --no-signoff -m "Skip signoff"

Incluir la salida de git status en la plantilla del mensaje que se muestra en el editor. Activado por defecto; útil para anular --no-status.

Cuando haga faltaIncluye la lista de estado en la plantilla del editor (predeterminado)

Ejemplo

git commit --status

Avanzado (12)

Cambiar el autor del commit. Indícalo con el formato 'Author Name <email@example.com>'.

Cuando haga faltaAtribuye el trabajo de otra persona; para trabajo en pareja, mejor una línea Co-authored-by

Ejemplo

git commit --author="John Doe <john@example.com>" -m "Fix bug"

Cambiar la fecha de autoría del commit. Admite varios formatos, como ISO 8601, RFC 2822 o fechas relativas.

Cuando haga faltaSustituye la fecha de autoría; casi nunca hace falta

Ejemplo

git commit --date="2025-01-15 10:30:00" -m "Backdated commit"

Con --amend, -C o -c (o al hacer commit tras un cherry-pick con conflictos), hacerte a ti, quien hace el commit, autor del commit resultante y renovar la fecha de autoría.

Cuando haga faltaReclama la autoría al hacer amend o reutilizar un mensaje

Ejemplo

git commit --amend --reset-author

Saltarse los hooks pre-commit y commit-msg. Con cuidado: estos hooks suelen garantizar la calidad del código.

No recomendadoSe salta las comprobaciones pre-commit y commit-msg; mejor corrige lo que indica el hook

Ejemplo

git commit -n -m "Quick fix (skip hooks)"

Permitir un commit sin ningún cambio. Útil para disparar pipelines de CI/CD o marcar hitos.

Cuando haga faltaCommits sin cambios, p. ej. para lanzar la CI

Ejemplo

git commit --allow-empty -m "Trigger rebuild"

Permitir un commit con el mensaje vacío. En general no se recomienda, porque el historial se entiende peor.

No recomendadoLos mensajes vacíos hacen ilegible el historial

Ejemplo

git commit --allow-empty-message -m ""

Indicar cómo limpiar el mensaje antes del commit. Modos: strip, whitespace, verbatim, scissors, default (strip si se abre el editor; si no, whitespace).

Cuando haga faltaControla cómo se quitan del mensaje las líneas # y los espacios

Ejemplo

git commit --cleanup=verbatim -m "Keep message exactly as-is"

Firmar el commit con GPG. Demuestra que el commit es tuyo y que no se ha manipulado. Requiere tener GPG configurado.

Cuando haga faltaFirma cuando tu proyecto o tu servicio de alojamiento verifiquen firmas

Ejemplo

git commit -S -m "Signed commit"

No firmar el commit con GPG. Anula la configuración commit.gpgSign si vale true.

Cuando haga faltaAnula commit.gpgSign para un commit

Ejemplo

git commit --no-gpg-sign -m "Unsigned commit"

Crear un commit fixup para usarlo con git rebase --autosquash. Durante el rebase, el commit se fusiona automáticamente con el commit indicado.

RecomendadoForma limpia de corregir un commit anterior junto con rebase --autosquash

Ejemplo

git commit --fixup=abc1234

Crear un commit squash para usarlo con git rebase --autosquash. Como --fixup, pero conserva ambos mensajes para combinarlos durante el rebase.

Cuando haga faltaComo --fixup, pero permite combinar los mensajes

Ejemplo

git commit --squash=abc1234

Añadir un trailer (clave: valor) al mensaje del commit. Trailers habituales: Reviewed-by, Co-authored-by, Fixes, etc.

Cuando haga faltaMetadatos estructurados como Co-authored-by o Reviewed-by

Ejemplo

git commit --trailer "Reviewed-by: Jane <jane@example.com>" -m "Fix bug"

Experto (8)

En un dry-run, mostrar la salida en formato corto. Muestra el estado de los archivos de forma compacta, como git status -s. Implica --dry-run.

Cuando haga faltaSalida del simulacro en formato de estado corto

Ejemplo

git commit --dry-run --short

En un dry-run, mostrar la salida en formato largo (por defecto). Muestra el estado detallado de los archivos.

Cuando haga faltaSalida del simulacro en formato de estado largo

Ejemplo

git commit --dry-run --long

En un dry-run, mostrar la salida en formato porcelain. Salida estable y apta para scripts que no cambia entre versiones de Git.

Cuando haga faltaSalida del simulacro legible por máquinas para scripts

Ejemplo

git commit --dry-run --porcelain

Mostrar la rama y la información de seguimiento incluso en formato corto durante un dry-run.

Cuando haga faltaAñade información de la rama a la salida corta/porcelain del simulacro

Ejemplo

git commit --dry-run --short --branch

En las salidas de estado short o porcelain, terminar las entradas con NUL en lugar de salto de línea. Útil para analizar nombres de archivo con caracteres especiales.

Cuando haga faltaSalida del simulacro terminada en NUL para scripts

Ejemplo

git commit --dry-run --porcelain -z

No incluir la salida de git status en la plantilla del mensaje al usar el editor.

Cuando haga faltaOculta la lista de estado en la plantilla del editor

Ejemplo

git commit --no-status

Saltarse el hook post-rewrite, que git commit solo ejecuta al hacer amend (--amend).

Cuando haga faltaOmite el hook post-rewrite en --amend; casi nunca hace falta

Ejemplo

git commit --amend --no-post-rewrite

Leer el pathspec desde un archivo (uno por línea) en lugar de la línea de comandos. Usa '-' para leer de la entrada estándar.

Cuando haga faltaPara scripts que confirman muchas rutas

Ejemplo

git commit --pathspec-from-file=files.txt -m "Commit listed files"

Elegir la opción adecuada

Opciones del mensaje

Distintas formas de indicar o editar el mensaje del commit

ComandoOrigenAbre el editorCaso de uso
git commit -m "msg"En línea✗Commits rápidos con mensajes cortos
git commit -F fileArchivo✗Mensaje ya escrito en un archivo
git commit -t filePlantilla✓Empezar con una plantilla en el editor
git commit -eEditor✓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

ComandoModoQuita comentariosQuita espaciosIdeal para
--cleanup=stripstrip✓✓La mayoría de commits
--cleanup=whitespaceEspacios✗✓Conservar los comentarios #
--cleanup=verbatimLiteral✗✗Conservar el mensaje tal cual
--cleanup=scissorsTijerasSolo 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

ComandoSustituyeFormatoUso típico
--author="Name <email>"AutorNombre <email>Hacer commit en nombre de otra persona
--date="date"Fecha de autoríaISO 8601 / relativaPoner fechas pasadas a los commits
--reset-authorAmbosUsuario/hora actualesAsumir la autoría de un parche aplicado

Amend y corrección del historial

Opciones para modificar commits existentes

ComandoCreaModifica HEADUsar con
git commit --amendSustitució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

ComandoPrepara antesCommitsDirectorio de trabajo
git commit✗Solo lo preparadoSin cambios
git commit -aArchivos con seguimientoTodos los que tienen seguimientoSin cambios
git commit -i <file>IndicadosPreparado + archivoSin cambios
git commit -o <file>Solo los indicadosSolo el archivoLos demás preparados, excluidos
git commit -pInteractivoFragmentos elegidosSin cambios

Firma GPG

Firmar commits criptográficamente para poder verificarlos

ComandoAcciónClave usadaCuándo usarla
git commit -SFirmarClave GPG por defectoDemostrar la autenticidad del commit
git commit -S<keyid>FirmarClave concretaUsar otra clave de firma
git commit --no-gpg-signNo firmarNingunoAnular commit.gpgSign=true

Control de hooks

Saltarse o controlar los hooks pre-commit y post-commit

ComandoSe saltaNivel de riesgoCuándo usarla
git commit --no-verifypre-commit + commit-msgMediaArreglo urgente, reparar los hooks después
git commit --no-post-rewritepost-rewriteBajoSaltarse el procesamiento lento tras un amend

Dry-run y formato de salida

Ver qué entraría en el commit sin hacerlo

ComandoFormatoAnalizableMuestra
--dry-runLargo (por defecto)✗Estado completo con pistas
--dry-run --shortCorto✓Códigos de estado compactos
--dry-run --porcelainPorcelain✓Formato estable para scripts
--dry-run --branchCon la rama✓Añade información de seguimiento al formato corto
--dry-run -zSeparado por NUL✓Seguro con nombres de archivo especiales

Estado mostrado en el editor

Controlar qué aparece en el editor al escribir el mensaje

ComandoEn el editorEfecto
git commit --statusEstado como comentariosVer los archivos del commit (por defecto)
git commit --no-statusSin lista de archivosEditor más limpio, menos distracciones
git commit -vDiff completoRevisar los cambios exactos mientras escribes
git commit -qEditor normalOcultar el resumen tras el commit

Commits especiales

Crear commits en situaciones poco habituales

ComandoPermiteCrea commitCaso de uso
--allow-emptySin cambios✓Disparadores de CI, marcas de rama
--allow-empty-messageSin mensaje✓Scripts automáticos (no recomendado)
--trailer "Key: value"Metadatos✓Co-authored-by, Fixes, Reviewed-by

Ejemplos de flujos de trabajo

1
git add .

Preparar tus cambios

2
git commit -m "Fix typo in README"

Hacer commit con un mensaje corto

1
git add -A

Preparar todos los cambios

2
git commit

Abre el editor para un mensaje de varias líneas

3
(Write: subject line, blank line, detailed body)

Seguir la regla 50/72 de formato

1
git add forgotten-file.js

Preparar el archivo olvidado

2
git commit --amend --no-edit

Añadirlo al último commit sin cambiar el mensaje

1
git commit --amend -m "Corrected message"

Sustituir el último commit con un mensaje nuevo

1
git commit -a -m "Update config files"

Preparar automáticamente los archivos con seguimiento modificados/borrados y hacer commit

1
git add .

Preparar los cambios

2
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 = vim
iEntrar en modo inserción (empezar a escribir)
EscSalir del modo inserción
:wqGuardar y salir (completa el commit)
:q!Salir sin guardar (cancela el commit)
ddBorrar la línea actual
uDeshacer el último cambio

Nano

core.editor = nano
Ctrl+OGuardar el archivo (write out)
Ctrl+XSalir (pregunta si guardar si hay cambios)
Ctrl+KCortar la línea actual
Ctrl+UPegar el texto cortado
Ctrl+WBuscar en el archivo

VS Code

core.editor = "code --wait"
Ctrl+SGuardar el archivo
Ctrl+WCerrar la pestaña (completa el commit)
Ctrl+ZDeshacer
Close without savingCancelar el commit

Modo patch (-p)

git commit -p
yPreparar este fragmento
nNo preparar este fragmento
qSalir; no preparar los fragmentos restantes
aPreparar este fragmento y todos los restantes
dNo preparar este fragmento ni los restantes
sDividir el fragmento en fragmentos más pequeños
eEditar el fragmento a mano
?Mostrar la ayuda

Solució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-lease

Your 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 main

Consejos 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

A:

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

A:

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.

A:

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.

A:

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

A:

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.

A:

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

A:

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.

A:

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.

A:

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.

A:

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.