Git: Squash múltiples confirmaciones en una sola confirmación

Una de las cosas buenas de Git es su flexibilidad, lo que le permite realizar casi cualquier tarea en un árbol de código fuente que necesite. En este caso me refiero a...

Una de las cosas buenas de Git es su flexibilidad, que le permite realizar casi cualquier tarea en un árbol de fuentes que necesite. En este caso, me refiero a limpiar el historial de un árbol de fuentes mediante la eliminación de confirmaciones.

Cuando aplastas las confirmaciones, estás combinando 2 o más confirmaciones en una sola confirmación. Esto se puede hacer por muchas razones, una de las cuales es que el historial de código fuente debe limpiarse antes de compartirlo con su equipo o enviar una solicitud de extracción a un proyecto de código abierto. Por ejemplo, supongamos que su historial de confirmación reciente se parece a esto:

1
2
3
4
5
6
7
8
$ git log --oneline
b7c864c Seriously, #421 is fixed now
7729f48 Fixed typo
cc4f2b5 Didn't work, trying something else
b1339db Fixed issue #421
c9f9e96 Updated docs for feature ABC
4eeb10f Added feature ABC
...

Como puede ver en los registros, el problema n.º 421 requirió algunos intentos para solucionarse. Aunque es genial que finalmente se haya encontrado la solución, esto no es exactamente algo que le gustaría compartir con el resto de su equipo. Lo único que realmente les importa es la solución final al problema #421, pero no necesariamente cómo llegaron allí. En casos como este, es posible que desee combinar las confirmaciones para crear una confirmación agradable y limpia para este problema.

Para aplastar las confirmaciones, deberá usar el comando rebase de esta manera:

1
$ git rebase -i HEAD~4

Esto le dice a Git que vuelva a aplicar las últimas 4 confirmaciones además de otra sugerencia base. El indicador -i es la abreviatura de --interactive, que abrirá su editor de texto predeterminado para que pueda editar los comandos antes de cambiar la base. Para nuestro ejemplo anterior, veríamos un editor de texto con las últimas 4 confirmaciones en orden inverso, como el siguiente:

1
2
3
4
pick b1339db Fixed issue #421
pick cc4f2b5 Didn't work, trying something else
pick 7729f48 Fixed typo
pick b7c864c Seriously, #421 is fixed now

Cualquier confirmación con la palabra clave "picK" permanecerá en el árbol de fuentes. Sin embargo, si reemplaza "pick" con "squash", ese compromiso se combinará con el anterior. Continuando con nuestro ejemplo, nos gustaría combinar las confirmaciones de esta manera:

1
2
3
4
pick b1339db Fixed issue #421
squash cc4f2b5 Didn't work, trying something else
squash 7729f48 Fixed typo
squash b7c864c Seriously, #421 is fixed now

Guardar sus ediciones en este archivo dará como resultado una sola confirmación que es la combinación de los cambios de los cuatro, y el mensaje de confirmación también es una combinación de los 4. Para especificar un nuevo mensaje de confirmación, debe usar "reword" en lugar de "pick" en la primera confirmación.

O, si desea mantener solo el mensaje de confirmación "seleccionado", puede usar "arreglar" en lugar de "aplastar" para los demás, lo que hará lo mismo que aplastar pero descartar la confirmación. mensaje.

Aquí están todos los comandos que se pueden usar al reorganizar:

  • pick (o p): usa commit
  • reword (o r): usa confirmación, pero edita el mensaje de confirmación
  • editar (o e): use commit, pero deténgase para modificar
  • squash (o s): use la confirmación, pero combínela con la confirmación anterior
  • fixup (o f): como "squash", pero descarta el mensaje de registro de este compromiso
  • exec (o x): ejecutar comando (el resto de la línea) usando shell
  • drop (o d): eliminar compromiso

Y algunas otras notas importantes de Git con respecto al modo interactivo al reorganizar confirmaciones:

  • Las líneas se pueden reordenar - se ejecutan de arriba a abajo.
  • Si elimina una línea allí ** ese compromiso se perderá **.
  • Sin embargo, si eliminas todo, la reorganización se anulará.
  • Tenga en cuenta que las confirmaciones vacías están comentadas

Arreglar sus compromisos de esta manera es una buena práctica antes de compartir con los miembros de su equipo o antes de enviar los cambios a un repositorio remoto. Es mucho más fácil leer un árbol de código fuente y comprender qué errores se han corregido cuando, por ejemplo, una única confirmación corrige un único error. Sin embargo, si alguna de estas confirmaciones ya se envió al repositorio remoto, no se recomienda aplastar las confirmaciones, ya que estaría reescribiendo el historial.

Para obtener más información, recomiendo leer los documentos de Git para el comando rebase [aquí] (https://git-scm.com/docs/git-rebase).

Licensed under CC BY-NC-SA 4.0