Combina commits con Git Squash

11 Jul 2021 5 min (0) Comentarios

En este post vamos a ver como combinar múltiples commits en uno solo utilizando una funcionalidad de git muy poderosa llamada interactive rebase.

 

 

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:

branch status

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:

ideal branch strructure

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.

github history

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:

github desktp

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:

result stash github desktop

 

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

 


Uso del bloqueador de anuncios adblock

Hola!

Primero de todo bienvenido a la web de NetMentor donde podrás aprender programación en C# y .NET desde un nivel de principiante hasta más avanzado.


Yo entiendo que utilices un bloqueador de anuncios como AdBlock, Ublock o el propio navegador Brave. Pero te tengo que pedir por favor que desactives el bloqueador para esta web.


Intento personalmente no poner mucha publicidad, la justa para pagar el servidor y por supuesto que no sea intrusiva; Si pese a ello piensas que es intrusiva siempre me puedes escribir por privado o por Twitter a @NetMentorTW.


Si ya lo has desactivado, por favor recarga la página.


Un saludo y muchas gracias por tu colaboración

© copyright 2024 NetMentor | Todos los derechos reservados | RSS Feed

Buy me a coffee Invitame a un café