Una de las herramientas que más utilizamos los desarrolladores de software es Git y, ya sea en el ámbito profesional o privado, sinceramente, me gusta tener un historial de commits limpio y resumido ya que si tenemos muchas confirmaciones el historial de versiones resulta caótico y poco útil.
Por el motivo anterior he hecho el siguiente tutorial sobre cómo limpiar el historial de commits de Git a través de los siguientes métodos:
- Terminal, aunque es el método más complejo también es el método más versátil pues servirá en cualquier entorno y proyecto ya que no depende de ninguna herramienta, sistema operativo o IDE.
- VSCode, a través de este potente editor de texto y código también podemos eliminar confirmaciones de Git y limpiar su historial siguiendo unos sencillos pasos que veremos a continuación.
- Visual Studio, el método más sencillo pero más limitado por dos motivos, el primer motivo es que no permite eliminar confirmaciones intermedias, solo las N últimas, el segundo motivo es que Visual Studio no es tan ampliamente utilizado como VSCode o una terminal, se utiliza en menos proyectos y entornos.
Ten cuidado al limpiar el historial y eliminar commits de Git

Antes de proceder a ver los pasos para eliminar commits de Git y limpiar su historial me gustaría advertirte sobre este método. Debes tener mucho cuidado con esta operación y dónde la realizas.
Si realizas la operación en un repositorio donde solo trabajas tú no hay ningún problema, puedes pasar a las siguientes secciones.
Si realizas el cambio en un repositorio donde trabajan más personas deberás tener en cuenta la rama donde vas a realizar el cambio:
- Si es una rama tuya, donde, de nuevo, solo trabajas tú, tampoco hay ningún problema ni medida cautelar a tener en cuenta.
Este sería el caso de una ramafeatureofixdonde solo estás desarrollando tu solo y, antes de hacer el merge adevelop, quieres juntar todas las confirmaciones en una sola para dejarlo más limpio. - Si es una rama compartida donde trabajan otras personas de forma simultánea como, por ejemplo,
developomaster, tienes tres opciones:- Lo más seguro es evitar esta operación y no eliminar commits en ramas de este tipo. La limpieza y eliminación de confirmaciones debería hacerse en las ramas auxiliares (como por ejemplo
fix/fix-1507) antes de mezclarlas contradevelopomaster. - Si quieres hacer una limpieza en
developomastermi recomendación es que lo hagas en commits antiguos que nadie esté utilizando o referenciando. - Si, aún así, quieres eliminar commits recientes de Git que se están referenciando o utilizando te recomiendo que avises a las personas que trabajan en esa rama y, antes de hacer nada, hagan
PullyPushde los cambios. Después, mientras realizas la operación y hasta que termines, nadie debe enviar cambios ni trabajar sobre la rama. Finalmente, cuando hayas subido los cambios de la limpieza avisa a tus compañeros para que haganPully se descarguen la nueva estructura del repositorio.
- Lo más seguro es evitar esta operación y no eliminar commits en ramas de este tipo. La limpieza y eliminación de confirmaciones debería hacerse en las ramas auxiliares (como por ejemplo
Es muy importante que tengas en cuenta los anteriores puntos porque puedes dejar a tus compañeros en commits que has borrado y ésta es una situación un poco dificil de solucionar que te puede traer bastantes dolores de cabeza.
Cómo eliminar commits con la terminal de Git
Este es el método más versátil debido a que es estándar, no requiere de ninguna herramienta adicional ni depende de ningun sistema operativo concreto, lo único que necesitamos es una terminal y Git instalado en el dispositivo.
Un punto importante a tener en cuenta es que este método permite combinar varios commits en uno solo. Te recomiendo que si quieres mezclar varias secciones distintas repitas el proceso para cada una de las secciones. Por ejemplo, suponiendo que tenemos los commits a,b,c,d,e,f,g y quieres mezclar b y c y, por otra parte, quieres mezclar e y f, deberás repetir este proceso dos veces, uno por cada mezcla.
Dicho de otro modo, si los commits a mezclar son consecutivos solo deberás seguir el proceso una vez pero, si por el contrario, los commits a mezclar no son consecutivos, deberás repetir el proceso por cada bloque de confirmaciones consecutivas.
Partiremos del siguiente ejemplo donde hemos sacado la rama terminalBranch desde main y hemos creado 6 confirmaciones, para ver el log o gráfico de Git utilizaremos el comando git log --oneline --graph --decorate --all:

Utilizaremos, entre otros, el comando rebase con las opciones pick y squash, más adelante explicaremos cada uno de estos parámetros.
Vamos a suponer que queremos mezclar los commits 2, 3 y 4. Los pasos para limpiar el historial de Git a través de la terminal y eliminar commits intermedios son:
- Visualiza el historial de cambios con el comando
git log --oneline --graph --decorate --ally asegúrate de que estás en la rama correcta y de que estás situado en el commit más reciente. - Utiliza el comando
git rebase -i iddondeides el identificador del commit anterior al primero que quieres fusionar. En nuestro ejemplo el commit más antiguo que queremos mezclar es el 2, pues en el comandogit rebase -i idel parámetroiddebe ser el identificador del comit anterior al 2, es decir, el identificador del commit 1:
Git rebase ejemplo con terminal - Lee el archivo para mezclar y eliminar commits. Se abrirá un archivo en tu editor de texto por defecto con las confirmaciones candidatas a fusionar, lee la documentación y las opciones disponibles.

Archivo para mezclar confirmaciones de Git - Entiende la diferencia entre
pickysquash:- Si dejamos en todos la opción por defecto
pickninguno de ellos se fusionará y, por lo tanto, el historial de Git quedará como antes. - Si ponemos
squashen uno de ellos éste se mezclará con su anterior. Por ejemplo, si ponemossquashdelante del commit 3, éste se mezclará con el 2.
- Si dejamos en todos la opción por defecto
- Modifica el archivo para que se mezclen los commits que quieres. En nuestro ejemplo queremos fusionar los commits 2, 3 y 4, pues bien, lo único que debemos hacer es poner
squashdelante del 3 para que se mezcle con el 2 y ponersquashdelante del 4 para que se mezcle con el 3. En el resto dejaremospick.
Guarda el archivo y ciérralo para que se apliquen los cambios.
Pick y squash para limpiar historial de Git - Modifica el nuevo mensaje de los commits fusionados. Debido a que hemos mezclado varias confirmaciones en una sola, ésta deberá tener un mensaje, para modificarlo se abrirá otro fichero en tu editor de texto por defecto. Al igual que antes, después de modificarlo, guarda los cambios y ciérralo:

Nuevo mensaje de Git para confirmaciones fusionadas - Verifica los cambios en la rama local con el comando
git log --oneline --graph --decorate --all. Como puedes observar ahora en la rama local tenemos los commits «1», «mezcla», «5» y «6»:
Mezcla de commits en rama local con Git - Sube los cambios con
git push -f. Debemos utilizar la opción-f(force push) porque sino nos dará error, esto se debe a que la ramaterminalBranchlocal es distinta en estructura a la misma rama subida en Github. - Verifica los cambios en la rama remota con el comando
git log --oneline --graph --decorate --all. Como puedes comprobar ahora tenemos tanto en local como en remoto la misma estructura de rama con los commits «2, 3 y 4» resumidos en una única confirmación:
Como eliminar y mezclar commits en Git resultado
Limpiar historial de Git con VSCode
La forma de limpiar el historial de Git con VSCode y eliminar commits intermedios es muy similar a la que acabamos de hacer con la terminal. Esto se debe a que VSCode no tiene ninguna herramienta ni ninguna utilidad a día de hoy que nos facilite esta tarea (a diferencia de Visual Studio que, como veremos más tarde, si nos simplifica un poco el proceso).
Debido a lo anterior te recomiendo encarecidamente que leas el apartado de limpiar el historial de Git con la terminal para que entiendas conceptos y explicaciones que vamos a pasar por alto en esta sección.
Partiremos del siguiente ejemplo donde tenemos la rama vscodeBranch con 6 confirmaciones y queremos fusionar la 3, 4 y 5:

Los pasos para eliminar commits y limpiar el historial de Git con VSCode son los siguientes:
- Activa la sección de control de versiones en VSCode haciendo click con el botón derecho del ratón sobre el menú lateral izquierdo:

Como activar seccion control versiones en VSCode - Activa la terminal en VSCode a través del menú superior «View», «Terminal».
- Asegúrate de que estás en el commit más reciente y en la rama correcta. A diferencia del apartado anterior para este punto utilizaremos el visor de Git de VSCode el cual puedes encontrar en el apartado «Graph» de la sección «Source control».
- Copia el id del commit anterior al que quieres mezclar, por ejemplo, si queremos mezclar los commits 3, 4 y 5, el id que tenemos que copiar es el de 2:

Obtener id commit a traves de VSCode - Ejecuta en la terminal de VSCode el comando
git rebase -i iddonde, como su nombre indica, el parámetroides el valor del identificador que hemos obtenido en el paso anterior. - Modifica el archivo que se acaba de abrir de tal forma que aparezca como el siguiente ejemplo:
No te olvides de guardar y cerrar el archivo para que se apliquen los cambios.pick 307d6e7 3 squash d5d1bb8 4 squash ae1286d 5 pick 73c23e7 6 - ¿Qué diferencia hay entre pick y squash?, pues bien,
pickdeja los commits sin modificar, tal y como estaban antes ysquashmezcla el commit con su anterior. Siguiendo nuestro ejemplo si ponemossquashen el 4 éste se mezclará con el 3 y, si lo ponemos en el 5, éste se mezclará con el 4.
El resultado final será una única mezcla del 3, 4 y 5. - Modifica el mensaje del nuevo commit en el archivo que se ha abierto automáticamente. Dado que hemos mezclado varios commits en uno solo, esta nueva confirmación deberá de tener su propio mensaje. Al igual que antes deberás guardar y cerrar el archivo para que los cambios tengan efecto. Un ejemplo de cómo establecer un mensaje de mezcla es el siguiente:
# This is a combination of 3 commits. Merging commits 3,4 and 5 into a single commit # This is the 1st commit message: 3 # This is the commit message #2: 4 # This is the commit message #3: 5 - Verifica los cambios en la rama local a través del gráfico de VSCode:

Mezclar varios commits en uno solo con VSCode - Sube los cambios a la rama remota utilizando el comando
git push -fy verifica que tanto la rama local como la remota son idénticas y tienen el historial limpio y las confirmaciones intermedias eliminadas:
Resultado de eliminar commits con VSCode y terminal
Cómo mezclar commits con Visual Studio y Git
Partiremos, al igual que los anteriores ejemplos, de una rama llamada vsBranch con 6 confirmaciones donde vamos a mezclar los commits 3, 4, 5 y 6.
Como ya hemos comentado en la introducción este es el método más fácil aunque no siempre vamos a poder utilizarlo ya que fuera de .NET se utilizan otros IDE’s y editores de código.
Además es importante que tengas en cuenta que a través de este método solo se pueden mezclar los últimos N commits (por ejemplo 4, 5 y 6) pero no confirmaciones intermedias (por ejemplo 2, 3 y 4).
Si quieres mezclar confirmaciones intermedias podrás observar que la opción «Squash commits» está deshabilitada y deberás utilizar el método de la terminal o el método de VSCode.
Los pasos para mezclar commits de Git con Visual Studio son los siguientes:
- Activa git force push en Visual Studio a tavés del menú «Tools», «Options». Dentro de la ventana selecciona «Source Control», «Git Global Settings» y habilita la opción «Enable push –force-with-lease».

Activar git force push en Visual Studio - Abre el visor de Git de Visual Studio a través del menú «View», «Git repository».
- Asegúrate de estar en la rama correcta y en la última confirmación.
- Selecciona los commits a mezclar presionando la tecla
Control+click izquierdodel ratón, después selecciona la opción «Squash commits» del desplegable:
Seleccionar commits a mezclar con Visual Studio - Establece un mensaje descriptivo para la confirmación donde se mezclarán los commits seleccionados y pulsa el botón
Squash. - Haz push de los cambios y, en la ventana que aparecerá, selecciona la opción «Force push»:

Force push en Visual Studio - Verifica que los cambios se han aplicado en el historial de Git:

Resultado eliminar commits con Visual Studio


















