Cómo eliminar commits de la rama master con GIT

0
18571

Introducción

Hace poco estuve trabajando en un hook de git y para las pruebas necesitaba estar haciendo commits y push constantemente para ver el resultado de mi prueba.

Para no tener que hacer cambios en el código de forma constante para realizar un commit, git nos da la opción de crear commits sin cambios en el código. Basta con usar la opción –allow-empty:

git commit -m «commit with no changes» –allow-empty

El problema de usar esta opción es que empiezas a llenar el historial de commits con información que no sirve para nada.

Pues bien, hoy vas a aprender a eliminar dichos commits de origin sin morir en el intento

Comencemos!

Lo primero que vamos a hacer es obtener el log de nuestro respositorio para ver cuales son los últimos commits y decidir cuáles son los que queremos borrar. Para ellos ejecuta el siguiente comando:

git log --pretty=oneline --abbrev-commit

De esta manera obtendremos el listado de commits de nuestra rama main:

22dcc79 (HEAD -> main, origin/main, origin/HEAD) empty commit 5
d53c00f empty commit 4
2c3d41d empty commit 3
a323615 empty commit 2
ecb7ef3 empty commit 1
7ed9c6e update version

Para nuestro ejemplo, lo que queremos hacer es eliminar todos los commits que tienen en la descripción «empty commit» que son todas mis pruebas. Es decir, los commits que van desde el commit d53c00f al ecb7ef3.

Para eliminar estos commits vamos a usar el comando «git rebase» el cual nos permite mover nuestra a rama a cualquier punto del historial de commits.

Ejecutemos pues el siguiente comando:

git rebase -i HEAD~6

Dicho comando nos abrirá nuestro editor por defecto con los últimos 6 commits del repositorio:

pick 7ed9c6e update version # empty
pick ecb7ef3 empty commit 1 # empty
pick a323615 empty commit 2 # empty
pick 2c3d41d empty commit 3 # empty
pick d53c00f empty commit 4 # empty
pick 22dcc79 empty commit 5 # empty

# Rebase 549dd76..22dcc79 onto 549dd76 (6 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 [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
# 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.

*Date cuenta de que los commits aparecen justo al revés de como nos los muestra git log, es decir, en este fichero el commit 22dcc79 es el más viejo

Justo debajo de los commits tenemos una leyenda en donde se nos explica qué podemos hacer con el historial de commits. Entre las distintas opciones está la de borrar líneas del fichero. Por lo tanto, vamos a borrar los commits que no queremos en el historial, quedando el fichero de la siguiente manera:

pick 7ed9c6e update version # empty

# Rebase 549dd76..22dcc79 onto 549dd76 (6 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 [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
# 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.

Una vez hemos guardado los cambios, lo siguiente que vamos a hacer es pushear el cambio a nuestra rama main:

git push origin +main

Presta especial atención al «+» delante de la rama «main». Este caracter está indicando a git que fuerce el push a dicha rama. Si no lo ponéis git se quejará y no podréis pushear el cambio. Una vez pusheado, comprobad cómo en vuestro historial de commits han desaparecido esos commits que no valían para nada.

Conclusiones

Hoy hemos aprendido como podemos eliminar commits de la rama main sin morir en el intento. Eso sí, tened mucho cuidado cuando hagáis este tipo de cambios ya que una vez borremos los commits, éstos desaparecerán y no podremos volver a recuperarlos. Tened mucho cuidado y habladlo con vuestro equipo antes de eliminar nada.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad