Notxor tiene un blog

Defenestrando la vida


Cómo importar un fichero de otra rama en un repositorio git

El problema

Desde que comencé el nuevo formato de blog utilizando emacs había algo que me rechinaba en todo el sistema. La herramienta utilizada es un modo de emacs que se llama org-page. Y como ya expliqué cuando me vi obligado a cambiar la manera en la que gestiono el blog, se basa fuertemente en la utilización de git para gestionar todo. En la documentación de org-page habla de dos ramas: una master donde se guardan los archivos que se van subir al espacio web y la rama source donde se van a poner los ficheros org que generarán la master.

El sistema anterior está bien pero desde el principio me rechinaba algo: la gestión de borradores. Si ponía los borradores en algún sitio en la rama source el sistema los reconocía y los trataba como artículos acabados. Lo mejor era tenerlos separados de esa rama. Para hacerlo se me ocurrían sólo dos alternativas: tener una rama borrador o en otro directorio.

Mi escaso conocimiento de git me hizo comenzar con la segunda de las alternativas, lo tenía todo en otro directorio. Digo lo tenía porque ahora ya no lo tengo, encontré el modo de tener todo lo referente al blog en un sólo sitio, todo bien encerrado y gestionado por git.

El problema principal para no haberlo hecho desde el principio es el modo de funcionamiento del sistema. Hasta ahora pensaba en las ramas como algo que se bifurca, pero que está destinado a formar parte del tronco principal tarde o temprano. La manera que se me había ocurrido era abrir una rama para cada borrador de artículo y fusionarla a source cuando se diera por finalizada la edición. Eso permitiría tenerlo todo en un mismo repositorio, pero un poco lioso de gestionar, sobre todo, porque algunos borradores están en proceso durante mucho tiempo, otros nunca ven la luz y otros apenas duran en ese proceso. Memorizar todas las ramas, saber en qué estado está cada borrador, era un engorro, pero lo que peor llevaba es que al mantenerlos en ramas separadas no podría tenerlos en edición a la vez.

De momento mantenía barios borradores en otro directorio y cuando acababa el artículo lo pasaba a mano al directorio de la rama source. Pero ahora mismo he abierto una rama borrador donde tengo los futuros artículos en el mismo lugar.

Las posibles soluciones

Mirando la documentación de git no terminaba de encontrar una solución y me puse a buscar en blogs y otros lugares buscando a alguien que tuviera el mismo problema y al final estuve barajando varias alternativas.

El comando cherry-pick

La situación de tener los archivos en otra rama hace que sea git quien tenga que gestionar el «alta» de un nuevo artículo. No se puede copiar el fichero y añadirlo al hilo de la rama. Lo primero que se me ocurrió y probé, pero no me transmitió una buena sensación fue utilizar el comando cherry-pick para mover un commit de una rama a otra.

La idea fundamental con este comando era hacer el commit con los cambios y luego traspasar dicho commit a la rama source. En principio funciona, pero da algunos quebraderos de cabeza, porque es al final es un commit que rompe la lógica lineal del hilo de una rama.

El comando checkout

Hasta ahora había utilizado el comando checkout sólo para cambiar de rama. Pero resulta que sirve para muchas cosas y principalmente para la que me interesa a mí. Por ejemplo, si hacemos lo siguiente:

~/proyectos/blog> git checkout source
Cambiando a rama 'source'
Tu rama está actualizada con 'origin/source'.
~/proyectos/blog> git checkout borrador -- path/al/nuevo-archivo.org
~/proyectos/blog> git status
En la rama source
Tu rama está actualizada con 'origin/source'.

Cambios a ser confirmados:
  (usa "git reset HEAD <archivo>..." para sacar del area de stage)

	nuevo archivo:  nuevo-archivo.org

A partir de aquí tengo el archivo que quería en la rama source. Se lo añado con add y hago el commit y el push como se haría habitualmente. Todo el trabajo realizado en los borradores se gestiona por tanto de forma paralela y en la rama source sólo se realiza la actualización con la versión definitiva.

Conclusión

La nueva forma de mantener los borradores en una rama del repositorio hace que el trabajo en el blog esté todo situado en el mismo lugar. Eso, a parte de mejorar la lógica del sistema, también facilita el poder trabajar en el blog desde cualquier dispositivo. Hasta ahora, los borradores estaban sólo en el ordenador en el que trabajo habitualmente, pero si se me ocurría alguna idea cuando no tenía acceso a él, la debía abandonar, o iniciar un fichero de borrador y luego pasarla al otro equipo. Esto hacía que en algún caso terminara con el mismo fichero en un estado distinto en cada ordenador.

Ahora, voy a probar todo lo dicho antes con este primer artículo salido de mi rama de borrador.


Comentarios