Hacer squash en Git, (“aplastar”), hace que nuestra rama a mergear (a la que haremos un pull request) se componga de un solo commit de esta manera mergearemos un solo paquete de código a nuestra rama de desarrollo que contendrá una funcionalidad completa. A posteriori será más fácil retirar o sustituir funcionalidades problemáticas o desechadas.

Antes de empezar:

Pero primero configuraremos un editor externo de Git para no tener que usar Vim que es el que nos viene por defecto configurado. En este ejemplo configuraremos la consola para que use Sublime Text, pero esta misma línea nos sirve para cualquier otro editor: Tras instalarlo nuestro editor tecleamos en el bash de Git:

 

Mediante línea de comandos:

Para hacer un squash empezaremos haciendo un rebase interactivo (rebase –i). Esta línea de ejemplo nos hará un rebase interactivo de nuestros 3 últimos commits:

Al aceptar el comando Git lanzara el editor de texto pre configurado con la siguiente información:

Son nuestros 3 commits seleccionados. Tenemos que decirle a Git que commits queremos juntar (squash) con que commit (pick). Por lo que marcamos el commit en el cual se fusionaran los demás usando pick, y squash para los commits que se fusionaran con el anterior.

Salvamos y cerramos el editor y Git hará un squash de nuestros commits.

NOTA: Si no hemos hecho nada raro (como intentar rebasear un commit merge) no debería haber fallos ni conflictos. Si los hubiera lo mejor es cancelar (git rebase –abort) y volver a empezar.

 

Mediante Tortoise:

Clic derecho en el directorio donde tenemos el repositorio en el cual queremos hacer el squash y elegir TortoiseGit -> Show log en el menú contextual.

Aparecerá el log, debemos hacer clic derecho en el commit mas reciente que no queremos squashear y elegir Rebase master onto this… en el menú contextual.

Aparecerá el dialogo de “Rebase”, seleccionar Force Rebase y hacer clic derecho en los commits para elegir Pick y squash en cada uno de ellos (O seleccionar Squash ALL).

Presionar Start Rebase para iniciar el procedimiento.