En este post vamos a ver como combinar múltiples commits en uno solo utilizando una funcionalidad de git muy poderosa llamada interactive rebase.
Índice
1 - Por qué combinar commits?
Antes de comenzar con la explicación como tal, creo importante ver los motivos por los que combinar múltiples commits en uno es importante.
El motivo principal es organizar o limpiar nuestro espacio de trabajo.
Pero que quiero decir? Cuando hacemos una pull request y nuestros compañeros revisan nuestro código, es común que tengan opiniones o ideas de cambios en el mismo.
En la gran mayoría de escenarios, son cambios mínimos, pueden ser muchos o pocos, no importa demasiado, pero al final son unos cuantos. Por ejemplo, convenciones tipo los nombres de las variables, métodos, o quizá algún algoritmo que podría ser mejorado
Además esos comentarios no siempre se hacen todos a la vez, sino que cuando la persona que revisa tu código ya cambiado puede ir viendo nuevas cosas, por lo que podemos acabar con una estructura de commits como la siguiente:
A todos nos ha pasado, no hay que avergonzarse, de hecho, mucho mejor que pase en la pull request que ir encontrándonos “código erróneo” haciendo cualquier otra tarea.
Como sabemos al hacer el merge, se aplican todos los commits por lo que el historial de nuestro branch main
también contendrá los “pr comment” dichosos. Idealmente deberíamos “limpiar” esos commits, para que no molesten por ejemplo a la hora de mirar el historial de un fichero, nuestra estructura debería lucir como la siguiente:
De esta forma, cuando hacemos el merge desde la pull request, únicamente veremos en el historial el commit combinado.
2 - Combinar múltiples commits con git CLI
Para combinar múltiples commits, debemos saber, ya bien sea el número de commits que queremos combinar o el hash.
Lo que queremos es combinar todos los commits realizados el 11 de julio.
2.1 - rebase interactivo en git
Por lo que Iremos a la línea de comandos y ejecutaremos uno de los siguientes dos comandos
git rebase -i [your hash]
o git rebase -i HEAD~(número de commits para revisar)
; En nuestro caso ejecutamos:
git rebase -i HEAD~4
Nota: si optamos por la opción de utilizar el hash del commit, tienes que elegir el commit previo al que sería el “inicial” en mi caso sería el hash del commit del 16 de octubre de 2020.
2.2 - squash múltiples commits
Una vez ejecutado el comando se nos abrirá un editor de texto, donde tendremos primero los commits, en orden de tiempo conforme fueron creados, osea los más viejos al principio.
Posteriormente las instrucciones de como hacer funcionar el fichero.
pick 39b2d22 Commit task1
pick aca2254 pr notes
pick 0b0c7dc pr notes
pick 343420f pr notes
# Rebase 35ffbb6..343420f onto 343420f (4 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
Como vemos nos explica los comandos, los más comunes serán pick (p)
lo cual significa que ese commit seguirá en el historial o squash (s)
el cual significa que ese commit se combinará con el anterior.
Por lo tanto, cambiamos nuestro fichero para que luzca de la siguiente forma:
pick 39b2d22 Commit task1
s aca2254 pr notes
s 0b0c7dc pr notes
s 343420f pr notes
como vemos combinamos todas los commits con “pr notes” dentro de “commit task 1”
Una vez cerremos el editor de texto los cambios tendrán lugar y podremos hacer git push
.
3 - Combinar commits usando GitHub Desktop
También podemos realizar esta acción desde la aplicación de escritorio de GitHub, para ello vamos a nuestro branch, y al historial.
Seleccionamos los commits que queremos “hacer desaparecer” y los arrastramos sobre el commit inicial:
Y nos saldrá una pequeña ventana en la que podemos modificar el commit y el comentario del mismo, el cual contendrá los mensajes de los commits que estamos haciendo el squash
Al confirmar, veremos como se nos combinan todos los commits en uno solo:
Conclusión
En este post hemos visto:
- La importancia de combinar commits
- Cómo combinar commits utilizando la interfaz de línea de comandos
- Cómo combinar commits utilizando GitHub Desktop