git ready

aprendiendo git de a un commit por vez
por Nick Quaranto, traducido por Matías Flores

reordenando commits con rebase

publicado el 20 Mar 2009

Uno de los múltiples usos que tiene el comando git rebase -i es el de reordenar commits. Pero por favor, POR FAVOR, nunca hagas un rebase sobre commits que hayan sido publicados. Si estás trabajando con otros desarrolladores, haciendo esto sólo lograrás que las integraciones tengan problemas, ocasionando dolores de cabeza a todos los involucrados. Es cierto, este comando permite modificar la historia del repositorio, pero sólo debes hacer esto cuando todos los commits involucrados están aún unicamente en tu propia máquina.

Una vez dicho esto, vayamos al grano. Supongamos que quieres cambiar la secuencia de commits. Por ejemplo, digamos que por alguna razón, ese tercer commit tendría más sentido si fuera el primero en la lista. Suponiendo que la historia reciente de tu repositorio es la siguiente:

Comencemos por ejecutar git rebase -i HEAD~3. Tu $EDITOR favorito aparecerá con un texto similar al siguiente:

pick 4c39bca gemspec tweak
pick 85409cf Version bump to 0.4.1
pick eb32194 Regenerated gemspec for version 0.4.1

# Rebase 60709da..eb32194 onto 60709da
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Reordenar los commits es tan sencillo como mover los comandos ‘pick’ dentro del texto. A modo de ejemplo, cambiamos el primer commit por el último:

pick eb32194 Regenerated gemspec for version 0.4.1
pick 85409cf Version bump to 0.4.1
pick 4c39bca gemspec tweak
...

$ git rebase -i HEAD~3
Successfully rebased and updated refs/heads/test.

Guardamos el archivo, y esperamos que todo salga bien. En caso contrario, probablemente tengas un conflicto que resolver. Si se torna muy complicado, recuerda que siempre puedes ejecutar git rebase --abort y volver al punto inicial. No te preocupes tampoco por la posible pérdida de datos, ya que siempre puedes usar la técnica de reflog. Como esperabamos, la historia ahora muestra los commits invertidos:

Ten en cuenta que las fechas de los commits están ahora invertidas, y que esto puede parecer algo extraño especialmente para otros desarrolladores que estén trabajando con tu repositorio. El reordenamiento de commits es probablemente más útil cuando se combina con otras opciones disponibles en un rebase interactivo, como squashing o la edición de mensajes de commit. Si has utilizado esta técnica y te ha ayudado (¡o aún si te ha dado problemas!) escríbenos un comentario.