Arreglando el histórico en git

Si usamos git en el día a día, probablemente nos habremos encontrado alguna vez con que olvidamos configurar nuestro user.name y/o user.email, el sistema coge valores por defecto y acabamos teniendo commits con autor o dirección de correo inválidos para el repositorio remoto (sea Github, Gerrit, BitBucket o cualquier otro). En tal caso hay que arreglar todos los commits incorrectos sí o sí.

Arreglar el último commit

Esta fiesta es la más sencilla. Para arreglar el último commit basta con hacer:

git commit --amend --author "New Author Name <email@address.com>"

Arreglar varios commits o un commit antiguo

Vale. La hemos cagado. Y ahora nos encontramos con miles de líneas de código que hemos ido comiteando sin hacer push, y de pronto tenemos a git rechazando el push porque el commiter es incorrecto para el repositorio remoto, es decir, su dirección de correo  y/o autor no los reconoce.

Podríamos decirnos que estamos jodidos y tratar de endosarle el marrón a otro, pero la verdad es que el problemón tiene solución. Es un poco pesada y usa algunas cosas de git que son peligrosas (puedes cambiar el orden de los commits de todo el repo jodiendo al resto de desarrolladores de tu equipo), pero siguiendo estas instrucciones con cuidado igual salvamos el culo…

En primer lugar hay que encontrar el commit más reciente en el repositorio local anterior a todos los que tienen mal el commiter. Por ejemplo, supón el siguiente histórico:

afffg2 patxi@gmail.com
cdfg34 jorge@gmail.com
3f55a4 patxi@gmail.com
345dg8 pepito@gmail.com
658dff patxi.gortazar@gmail.com
... a partir de aquí todo ok

Supongamos que hay que apañar el mail de patxi@gmail.com y cambiarlo por patxi.gortazar@gmail.com. El commit más reciente anterior a los que tienen el email patxi@gmail.com que hay que cambiar es el 345dg8 de pepito@gmail.com.

Ahora hacemos un git rebase con este commit como referencia:

git rebase -i -p 345dg8

Se abre un editor de texto que nos muestra todos los commits desde el 345dg8 en adelante. Cada commit está en una línea y comienza por “pick”. Tenemos que ver cuáles queremos cambiar y sustituir “pick” por “edit” y guardar. La cosa debería quedar tal que así:

edit afffg2 patxi@gmail.com
pick cdfg34 jorge@gmail.com
edit 3f55a4 patxi@gmail.com
pick 345dg8 pepito@gmail.com

Guardamos y salimos. Git nos informa de cómo proceder, básicamente vamos a ir avanzando haciendo commits parando en cada uno de los commits que le hemos dicho que queremos editar. Estos commits los apañaremos y seguiremos adelante con el proceso hasta el final.

Vamos paso por paso. En primer lugar, git habrá avanzado por defecto hasta el primer commit: 3f55a4. Vamos a arreglar este commit. Para ello usamos “git commit –amend” indicando el nuevo autor y correo electrónico:

git commit --amend --author "Patxi Gortázar <patxi.gortazar@gmail.com>"

Se abre un editor por si queremos cambiar el mensaje del commit. No tocamos nada, simplemente guardamos y salimos.

Ahora avanzamos hasta el siguiente commit que queremos arreglar:

git rebase --continue

Git se para en el commit afffg2. Arreglar este commit de la misma forma:

git commit --amend --author "Patxi Gortázar <patxi.gortazar@gmail.com>"

Aunque hemos arreglado todos los commits, aún le tenemos que decir a git que avance hasta el final, dejando el repo con los mismos commits que tenía antes de comenzar:


git rebase --continue

Listo. Prueba a hacer un pull (por si acaso) y un push.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s