Merge and squash (GitLab / GitHub...)

Es común hoy en día que en proyectos con una organización detrás, el trabajo se delegue a interfaces web como GitHub o GitLab, donde se puede hacer la integración desde una interfaz gráfica que permite visualizar diffs o poner comentarios. Conocemos el botón Merge commit, el botón Rebase and merge, pero... ¿qué es un squash y qué consecuencias tiene pulsar ese botón?

Cuando trabajamos con Git y utilizamos plataformas como GitHub, GitLab o Bitbucket para gestionar nuestros repositorios, nos encontramos con varias formas de fusionar ramas que pueden afectar significativamente al historial del proyecto. Estas opciones son el merge commit, el rebase and merge y el squash and merge, y cada una tiene sus particularidades que conviene entender para mantener un historial limpio y manejable.

La opción más tradicional y común es el merge commit. Cuando hacemos un merge de esta forma, Git crea un commit especial que une las dos ramas, dejando un nudo en el historial. Esto significa que si visualizamos el grafo de commits con git log --graph --oneline, veremos cómo las ramas se bifurcan y luego se unen en un punto, formando esos nudos característicos. Aunque funcional, este método puede hacer que el historial se vea más desordenado y menos lineal, algo que a algunos desarrolladores les puede resultar poco estético o difícil de seguir.

Por otro lado, tenemos la opción de rebase and merge. Esta estrategia consiste en reescribir el historial de la rama que queremos fusionar para que sus commits se apliquen encima de la rama principal, como si hubieran sido creados directamente a partir de ella. Esto se traduce en un historial más lineal y limpio, sin esos nudos que aparecen con los merge commits. El rebase es una operación destructiva en el sentido de que modifica el historial, pero es muy útil para mantener un registro claro y ordenado de los cambios. Si queremos profundizar en cómo funciona el rebase, podemos recordar que se trata de mover la base de una rama para que parezca que todos los commits se hicieron después del último commit de la rama principal.

Finalmente, la opción que está ganando mucha popularidad es el squash and merge. Esta técnica aplasta todos los commits de una rama en un único commit antes de fusionarlo con la rama principal. Esto es especialmente útil cuando en una rama de desarrollo se han hecho muchos commits intermedios, como correcciones de errores o pequeños ajustes, que no aportan valor individualmente al historial principal. Al hacer squash, el historial queda mucho más limpio y fácil de entender, ya que cada funcionalidad o cambio importante queda representado por un solo commit. Esto también facilita el uso de herramientas como git blame, que nos permiten identificar rápidamente quién hizo un cambio y por qué, sin tener que navegar por un historial lleno de commits menores o de merge.

Para ilustrar cómo se vería un squash, imaginemos que tenemos dos commits en una rama de desarrollo. Al hacer squash and merge, esos dos commits se combinan en uno solo que contiene todas las modificaciones de ambos. El resultado es un historial más compacto y legible.

# Visualización del historial con merge commit (nudos visibles)
git log --graph --oneline

# Rebase para aplicar commits encima de la rama principal
git rebase main

# Squash para combinar múltiples commits en uno solo
git merge --squash feature-branch
git commit -m "Funcionalidad implementada en un único commit"

En resumen, elegir entre merge commit, rebase and merge o squash and merge depende de nuestras preferencias y necesidades en cuanto a la limpieza y claridad del historial. El merge commit es sencillo y mantiene el historial completo con todos los detalles, el rebase and merge ofrece un historial lineal y ordenado, y el squash and merge nos permite presentar los cambios de forma compacta y clara, ideal para mantener un repositorio limpio y fácil de entender.

Lista de reproducción
  1. 1
    ¿Qué es Git?
    4 minutos
  2. 2
    Cómo instalar Git
    9 minutos
  3. 3
    Creando tu primer commit
    9 minutos
  4. 4
    Qué es el staging area
    10 minutos
  5. 5
    Cómo deshacer modificaciones de archivos
    7 minutos
  6. 6
    Cómo deshacer un commit con reset
    7 minutos
  7. 7
    Cómo revertir un commit con revert
    7 minutos
  8. 8
    Introducción a las ramas
    6 minutos
  9. 9
    Cómo crear y modificar ramas
    6 minutos
  10. 10
    Commits bajo el workflow Feature Branch
    6 minutos
  11. 11
    Cómo fusionar ramas con merge
    6 minutos
  12. 12
    Fusiones conflictivas
    9 minutos
  13. 13
    Cómo construir alias
    7 minutos
  14. 14
    Más sobre conflictos
    9 minutos
  15. 15
    Etiquetas
    7 minutos
  16. 16
    Tags anotados
    9 minutos
  17. 17
    git stash: esconder cambios
    6 minutos
  18. 18
    Introducción a remotos
    5 minutos
  19. 19
    Pusheando a un remoto
    6 minutos
  20. 20
    Clonando y haciendo pull
    6 minutos
  21. 21
    Fetch y pull rebases
    8 minutos
  22. 22
    Rebase
    7 minutos
  23. 23
    Rebase interactivo
    6 minutos
  24. 24
    Master, main y otros nombres de rama
    9 minutos
  25. 25
    git switch
    9 minutos
  26. 26
    git-restore
    10 minutos
  27. 27
    git-grep
    11 minutos
  28. 28
    Gitignore
    11 minutos
  29. 29
    El flag --patch
    9 minutos
  30. 30
    git-apply y parches en bruto (advanced)
    9 minutos
  31. 31
    Merge octopus (advanced)
    9 minutos
  32. 32
    Conventional commits
    12 minutos
  33. 33
    Merge and squash (GitLab / GitHub...)
    6 minutos
  34. 34
    git merge --squash
    7 minutos
  35. 35
    git-bisect
    8 minutos
  36. 36
    git-blame
    6 minutos
  37. 37
    git-reflog
    10 minutos
  38. 38
    Git para la Bash
    11 minutos
  39. 39
    Submódulos (parte 1)
    7 minutos
  40. 40
    Submódulos (parte 2)
    10 minutos
  41. 41
    Otros clientes Git (último episodio)
    9 minutos