Git
git commit

git commit comando: mensaje modificar, eliminar, cancelar, push, opciones

Este artículo cubrirá casi todo lo relacionado con el comando git commit. Cubriremos cómo editar, borrar y abortar mensajes de commit, abortar después de un push, y otras opciones útiles.

1. Un vistazo más de cerca al comando git commit

Después de crear un nuevo repositorio con el comando git init y poner en escena los cambios deseados con el comando git add, es hora de confirmar. El comando git commit es el responsable de registrar todos los cambios que se están preparando como nueva historia en el repositorio actual. Dado que esta es una parte tan central del sistema Git, vale la pena ser un poco más específico.

Veámoslo con más detalle, paso a paso

  1. Cuando escribes el comando git commit, Git comprueba si hay algún cambio en el repositorio. Si no hay cambios, mostrará el siguiente mensaje.
$ git commit
On branch main
nothing to commit, working tree clean
  1. tras confirmar la existencia del cambio, Git crea un nuevo objeto commit y le asigna un valor hash SHA-1. Como vimos en el post git add, este objeto es el responsable de almacenar todos los datos asociados a una única confirmación.

  2. se añaden al objeto commit valores de metadatos como autor, commiter y mensaje de commit.

  3. El objeto commit también almacena una referencia a un objeto árbol que representa el sistema de archivos en el momento del commit. El objeto Tree apunta al objeto Blob, que contiene el contenido real del archivo. De esta forma, el objeto commit tiene una instantánea conocida del estado actual.

  4. el commit más reciente en la rama de trabajo actual se almacena como el valor del commit padre del nuevo objeto commit. Esto asegura que la confirmación recién creada se registra en la rama actual.

  5. Finalmente, el HEAD que anteriormente apuntaba a la confirmación más reciente se cambia para apuntar a la nueva confirmación añadida, convirtiéndola en la última confirmación de la rama actual.

De esta forma, todos los cambios en el estado por etapas se registran como parte de la historia de ese repositorio. Es un comando simple, pero hay mucho que hacer.

A continuación, veremos cómo cambiar un mensaje de confirmación que ya ha sido confirmado.

2. Cómo editar un mensaje de confirmación

Git es un sistema que da mucha importancia a las confirmaciones una vez hechas. Esto es especialmente cierto para los commits que han completado un push. Esto se debe a que un único commit puede romper la sincronización con muchos miembros del equipo.

Dicho esto, todos somos humanos y cometemos errores. Si comete un error tipográfico en su mensaje de confirmación, puede corregirlo rápidamente y notificarlo a su equipo. Veamos cómo hacerlo.

En primer lugar, el comando para editar la última confirmación en la rama actual.

$ git commit --amend -m "new commit message"

Veamos el resultado real de la ejecución

git commit --amend resultado de la ejecución

El mensaje de confirmación 2.md created ha cambiado a 2.md created!!!.

Pero aquí hay algo que necesitas saber. Los dos commits en la misma ubicación tienen diferentes valores hash. Antes de ser cambiado, era 7d16880, y después de ser cambiado, era ff55e3d. Aunque parecía una corrección, Git había eliminado internamente el commit antiguo y registrado uno nuevo con los mismos cambios y un nuevo mensaje.

Esto podría potencialmente causar un conflicto con los miembros del equipo que empezaron un nuevo trabajo con el commit antiguo. Para evitar esto, si cambias el mensaje de confirmación, deberías notificarlo al equipo de la misma forma que lo harías para una nueva confirmación.

2.1. ¿Qué pasa si ya has confirmado una confirmación existente?

Si editas un commit existente localmente con la opción --amend, y el commit ya ha sido empujado antes de la edición, habrá una diferencia entre el repo local y el repo remoto. En este caso, no podrá enviar el repositorio local en ese momento. La idea es evitar que el repositorio remoto estropee tus commits por adelantado.

En este caso, obtendrás un mensaje de error como el siguiente.

$ git push origin main
! [rejected]        your-branch -> your-branch (non-fast-forward)
error: failed to push some refs to 'your-remote-repository-url'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.

Hay dos maneras de resolver esta situación.

2.2. solución force-push

El primer método es anular el rechazo del repo remoto y forzar al repo local actual a hacer push. I Si está ejecutando un proyecto en solitario, o si todos en su equipo son conscientes del problema actual, esto puede ser fácil.

Sólo se necesita un comando

$ git push -f

o

$ git push --force

Sin embargo, en todas las demás situaciones, como cuando un nuevo commit se registra en un repositorio remoto, o cuando un miembro del equipo está trabajando en un commit existente, tiene el potencial de desordenar el historial de commits, lo que puede ser bastante molesto.

Así que utilice este método sólo en situaciones en las que sea realmente seguro hacerlo.

2.3. Pull and merge workaround

El segundo método es algo más seguro. Consiste en extraer un historial de confirmaciones existentes de un repositorio remoto, y luego fusionarlo o volver a basarlo con tu historial de confirmaciones local. A continuación, puede volver a hacer push, tal y como lo haría con una fusión normal.

Este método es seguro, pero requiere algo de trabajo extra. Si todavía estás colaborando, el segundo método es el camino a seguir.

Para más información sobre los comandos pull, merge y rebase, consulta los artículos correspondientes.

3. Cómo deshacer una confirmación

He aquí cómo deshacer un commit, lo que hará desaparecer el commit existente, pero los cambios registrados en el commit existente volverán y serán modificados y unstaged.

El comando es el siguiente

$ git reset HEAD~1

Veámoslo en acción

Resultado de ejecutar git commit

Primero reemplazamos el contenido de 2.md por texto nuevo, seguido de add, y luego commit.

git reset HEAD~1 resultado de la ejecución

Después de completar el commit, lo comprobé con el comando git status y no había más cambios (nothing to commit).

A continuación, ejecuté git reset HEAD~1 para deshacer la confirmación, y los cambios en el archivo 2.md se revirtieron al estado unstaged. (unstaged changes after reset)

También puedes ver que el archivo 2.md está en estado unstaged en el estado comprobado después de deshacer la confirmación.

git log after reverting commit](/images/git/commit/commit4.webp)

Finalmente, ejecuta git log{:shell}: y verás que la confirmación 1ac689b que hemos registrado arriba ha desaparecido.

Así es como se deshace un commit sin perder todos los cambios.

4. Cómo borrar un commit

He aquí cómo borrar un commit, que borra el commit existente junto con los cambios registrados contra él. Puede usarse en lugar del método de cancelación de la Sección 3 si los cambios no son necesarios.

El comando es el siguiente

$ git reset --hard HEAD~1

Veámoslo en acción

git reset --hard HEAD~1 experimental settings

Si compruebas con git status, actualmente no hay cambios escenificados. Escénalos usando el comando git add, y luego completa la confirmación. Si compruebas los logs, verás que el commit del nuevo hash c2072b8 ha sido registrado.

git reset --hard HEAD~1 resultado de la ejecución

Ahora ejecuta git reset ---hard HEAD~1 para eliminar la última confirmación. No ha vuelto ningún cambio, y mirando el historial, la confirmación c2072b8 ha sido borrada con éxito.

5. Deshacer una confirmación push completada

Vimos esto antes en Sección 2.1, pero no es fácil deshacer o borrar una confirmación que has enviado a un repositorio remoto usando el comando git reset. Esto se debe a que el historial de confirmaciones del repositorio local y el remoto son diferentes, y el remoto rechazará la confirmación.

Una forma de evitar esto es el método force-push de la Sección 2.2, pero ya he mencionado que no es recomendable. En lugar de este método, Git proporciona un comando para deshacer explícitamente la confirmación anterior y registrar una nueva.

Los comandos son

$ git revert HEAD --no-edit

Este comando crea un nuevo commit que revierte todos los cambios del commit anterior. Esto podría hacerlo manualmente el desarrollador, pero los desarrolladores son humanos, y existe la posibilidad de que se les escape una sola línea. Por lo tanto, recomendamos utilizar el comando anterior para hacerlo por usted.

Echemos un vistazo a la ejecución real

git commit status

Este es el estado de la nueva confirmación actual.

Vamos a registrar un nuevo commit que revierta explícitamente el que acabamos de registrar.

Resultado de ejecutar git revert HEAD --no-edit

Se ha creado una nueva confirmación, y se ha escrito automáticamente un mensaje diciendo que hemos revertido una confirmación existente. Si no especifica la opción --no-edit, se abrirá un editor de texto plano como `vi' donde puede escribir el mensaje de confirmación que desee.

6. Otras opciones para facilitar el desarrollo

Las opciones -m y --amend del comando git commit han sido cubiertas en el código de ejemplo hasta ahora. Aquí tienes otras opciones a considerar.

6.1. La opción -a sin el comando git add -u

La opción git commit -a preparará y confirmará automáticamente todos los cambios sin usar el comando git add.

Ten en cuenta que esto excluye los archivos en estado sin seguimiento. Utilízala de la siguiente forma

$ git commit -a -m "commit without add command"

6.2. La opción --allow-empty para confirmaciones vacías

A veces quieres dejar un montón de confirmaciones sin cambios nuevos. Esta opción le permite dejar confirmaciones cuando no se han hecho cambios.

Úsela así

$ git commit --allow-empty -m "No changes"

6.3. Usando la opción --no-verify para anular los hooks pre-commit y commit-msg

Los hooks de Git son disparadores de eventos que ejecutan un script definido cuando ocurre un determinado evento. Los ganchos pre-commit hook y commit-msg hook se activan cuando se registra una nueva confirmación.

La opción --no-verify es una forma de ignorar estos hooks y crear un nuevo commit. Utilícela de la siguiente forma

$ git commit --no-verify -m "This Commit ignore hooks"

7. Conclusión

En este artículo hemos cubierto casi todo lo que hay que saber sobre el comando git commit. Creo que saber cómo hacer commit es tan importante como saber cómo modificar y borrar commits. Escribiré más posts en profundidad sobre los comandos git reset y git revert que hemos cubierto en este post.

copyright for git commit

© 2023 All rights reserved.