W3docs

git commit --amend

Información útil sobre el comando git commit --amend, formas de uso y ejemplos prácticos.

Qué hace git commit --amend

Es fácil terminar un commit y notar de inmediato un error tipográfico en el mensaje, o darse cuenta de que olvidaste hacer stage de un archivo. El comando git commit --amend es la forma más rápida de corregir esos errores: permite editar el commit más reciente de la rama actual.

En lugar de apilar un pequeño commit de seguimiento encima, --amend incorpora los cambios en el área de preparación (y, opcionalmente, un nuevo mensaje) al commit anterior. El resultado es un único commit limpio que parece como si lo hubieras hecho bien la primera vez.

git commit --amend

Reemplaza el commit, no lo edita

Esto es lo más importante que hay que entender sobre --amend. Los commits de Git son inmutables, por lo que Git no puede modificar realmente uno existente. En cambio, --amend crea un commit completamente nuevo a partir del árbol actual más el padre del commit anterior, y luego mueve el puntero de la rama hacia él. El commit original queda colgando (sin referencias) hasta que el recolector de basura lo elimina eventualmente.

Como el nuevo commit tiene una instantánea y/o mensaje diferente, también obtiene un hash de commit diferente. Ese único hecho explica cada regla a continuación, incluyendo por qué modificar commits compartidos es peligroso.

Cambiar el mensaje del commit más reciente

Si hiciste un commit con un mensaje incorrecto o poco claro, ejecuta git commit --amend para reescribirlo sin tocar la instantánea. Pasa el nuevo mensaje en línea con -m para omitir el editor:

git commit --amend -m "Fix typo in login validation"

Ejecuta git commit --amend sin opciones y Git abrirá tu editor con el mensaje anterior para que puedas editarlo de forma interactiva. Esto es útil para mensajes más largos que incluyen un cuerpo.

Agregar cambios olvidados al último commit

Supongamos que tenías la intención de confirmar dos archivos en una sola instantánea, pero olvidaste preparar uno de ellos. Prepara el archivo faltante y luego modifica el commit:

# You edit project.py and text.py, but only commit project.py
git add project.py
git commit -m "Add data processing helpers"

# You realize text.py belongs in that same commit
git add text.py
git commit --amend --no-edit

El indicador --no-edit conserva el mensaje del commit existente, por lo que Git incorpora silenciosamente el text.py recién preparado al commit anterior. Sin --no-edit, el editor se abre para que puedas actualizar el mensaje al mismo tiempo.

Puedes combinar ambas cosas: cambiar el mensaje e incluir archivos olvidados de una sola vez.

git add forgotten-file.js
git commit --amend -m "Add feature with all required files"

Confirmar el resultado con git log

Después de modificar el commit, inspecciona la rama con git log para verificar que el hash cambió y que el commit anterior ya no aparece en el historial:

git log --oneline -1

Un hash corto diferente junto a tu mensaje confirma que el amend creó un nuevo commit en lugar de editar el anterior en su lugar.

Errores comunes

  • --amend solo afecta al último commit. Para reescribir un commit más antiguo, usa un rebase interactivo (git rebase -i) en su lugar.
  • Todo lo que no esté en el área de preparación queda excluido. El amend confirma el índice actual, por lo que las ediciones sin preparar permanecen sin confirmar. Ejecuta git add primero.
  • La fecha del autor se conserva de forma predeterminada, pero la fecha del confirmador se actualiza. Añade --reset-author si también quieres actualizar la identidad y fecha del autor.

Evitar modificar commits enviados

Como el amend produce un commit con un nuevo hash, el commit reescrito ya no coincide con lo que otros han descargado. Nunca modifiques un commit que ya ha sido enviado y compartido con compañeros de equipo: su historial sigue apuntando al hash anterior, y un git push normal será rechazado. Forzar el push (git push --force) puede entonces sobrescribir o duplicar su trabajo.

El peligro es el mismo que al restablecer una instantánea pública: ambas reescriben el historial del que otros dependen. Mantén --amend para commits locales y no enviados, y evitarás el problema por completo.

Advertencia

Solo modifica commits que existan únicamente en tu máquina. Una vez que un commit ha sido enviado y descargado por otros, reescribirlo con --amend romperá su historial.

Práctica

Práctica
¿Cuáles son las afirmaciones correctas sobre el comando `git commit --amend`?
¿Cuáles son las afirmaciones correctas sobre el comando `git commit --amend`?
Was this page helpful?