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