Recuperar revisiones perdidas en Bazaar

Como saben los regulares de este blog, hace bastante tiempo me he rendido ante Bazaar, el sistema de control de versiones distribuido creado por Canonical y parte del proyecto GNU; más poderoso que SVN, más simple que git… en fin.

Una secuencia de acciones me llevó a una situación terrible: por un momento pensé que había perdido un conjunto de cambios del historial. La condiciones fueron más o menos las siguientes:

  1. Estaba trabajando en una copia local sobre la cual no sabía que estaba bindeada a un repositorio remoto (o sea, un checkout)
  2. Hice commit de un conjunto de cambios (que se grabaron con número de revisión 5)
  3. Ejecuté un bzr bind, con lo se aplicaron una serie de cambios que estaban en el repositorio remoto
  4. La versión del repositorio local bajó a 4… ¡los cambios realizados en la 5ª versión no estaban en ninguna parte!

En resumen, lo que había ocurrido era que había cambiado de línea temporal (al mejor estilo Fringe). Transformar nuevamente la copia en una rama no solucionaba nada, sin embargo suponía que esa revisión debía existir en el repositorio…. ¿cómo restituirla?

La respuesta es conceptualmente sencilla: todo lo que necesitamos hacer es traer los cambios de esa revisión al estado actual de nuestro árbol de trabajo; y a pesar que los números de revisión de bzr son dígitos, en realidad cada commit tiene un identificador único que podemos utilizar para recuperar esos cambios.

En este caso, para recuperar esos cambios debemos ejecutar en primer lugar bzr heads --all, con lo que podremos ver las últimas versiones que conviven en el historial de cambios, por ejemplo:

TIP of branch: /var/www/repo.bzr/master/
HEAD: revision-id: user@domain.com-20111220131621-ao5rkri1o80evnhh
  committer: Felipe Lavín <user@domain.com>
  branch nick: master
  timestamp: Tue 2011-12-20 10:16:21 -0300
  message:
    mensaje del commit

Luego, para recuperar los cambios extraviados:

bzr pull . --overwrite -r revid:user@domain.com-20111220131621-ao5rkri1o80evnhh

… y podemos seguir trabajando con normalidad.