Mezclar dos repositorios de git en uno

En esta ocasión voy a documentar cómo mezclar dos repositorios de git en uno. El escenario completo es el siguiente:

Se pretende realizar un proyecto documental. Y se comienza a desarrollar la fase de estudio y anteproyecto. A los pocos días descubro que parece que hay que emplear una plantilla. La plantilla no aparece donde debería, pero creemos encontrarla en otro lugar. Descargo la plantilla y la integro en mi repositorio, hago los cambios que considero necesarios y unas horas después aparece la plantilla definitiva donde debería estar desde un principio.

No voy a entrar a valorar la falta de comunicación e imprecisiones que llevan a esta situación caótica, pero si bien puedo, lo que se dice «hacer borrón y cuenta nueva«, me interesa que quede constancia del trabajo que se había hecho antes de la aparición de la plantilla definitiva y, me interesa, igualmente, que quede constancia de la línea temporal de este trabajo previo.

¿La solución? En principio parece buena clonar la plantilla como un nuevo repositorio y traerme el historial del proyecto antiguo a una ramaProyecto_old‘ del nuevo repositorio. A continuación, iré copiando lo que me interese a la rama principal del nuevo repositorio. No sé cómo saldrá. Últimamente, escribo estas cosas según lo voy haciendo por primera vez.

Clonando el nuevo repositorio

Creo un directorio, y entro en él.

mkdir nuevo_repo && cd nuevo_repo

Aquí, clono el repositorio en el que pretendo traer el antiguo.

git clone <url del repositorio>
Lenguaje del código: HTML, XML (xml)

Añadir el antiguo repositorio como remoto

Añado el repositorio antiguo como remoto del actual.

git remote add Proyecto_old /home/miusuario/proyecto_old
Lenguaje del código: Bash (bash)

Copiando el repositorio antiguo en una nueva rama

Ahora creo una nueva rama y me traigo el otro repositorio. Intentando que pase a formar parte de esta rama.

git checkout -b Proyecto_old git fetch Proyecto_old
Lenguaje del código: Bash (bash)

En este momento los repositorios están juntos, pero desconectados. Voy a hacer un merge del repositorio antiguo en la rama Proyecto_old.

git merge proyecto_old/master --allow-unrelated-histories
Lenguaje del código: Bash (bash)

Aquí pueden surgir conflictos. En este caso, así sucedió. Después de resolverlos, los añadí a stage-area e hice commit para confirmar el merge.

Trayendo los ficheros que me interesan a la rama principal

Ahora que está todo más o menos atadito toca traerse los ficheros que me interesan a las ramas con las que voy a seguir trabajando. Para esto, y por lo que pudiese pasar, me hago una nueva rama, Unificar trabajos desde master y muevo el puntero HEAD a ella.

git checkout master && git checkout -b Unificar_trabajos
Lenguaje del código: Bash (bash)

Ahora, me empiezo a traer ficheros desde la rama antigua:

git checkout proyecto_old .gitignore git checkout proyecto_old Anteproyecto/* git checkout Estudio_Previo.md git checkout Readme.md
Lenguaje del código: Bash (bash)

Los ficheros, entran directamente en stagging_area listos para confirmar con un commit.

Tras el commit, ya tengo los ficheros en el árbol de trabajo con el que quiero seguir trabajando.

Ahora, viendo que todo está como quiero, lo junto todo en master y ya está lista para seguir con el trabajo.

Una cosa más que he entendido. Hace unas semanas que me enfrenté a un problema semejante y no supe cómo encararlo. Aún preguntando a gente entendida en esto de git. A ver si en la próxima, puedo sacarle partido a esta experiencia.

¡Hala! ¡A pasarlo bien!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

He leído y acepto la política de privacidad

Información básica acerca de la protección de datos

  • Responsable: Carlos Alberto Sobrino Lusquiños
  • Finalidad: Gestión de consentimiento para la publicación y moderación de comentarios.
  • Legitimación: Gestión de consentimiento
  • Destinatarios: No se cederán los datos a terceros, excepto por obligación legal.
  • Derechos: Acceso, rectificación, supresión y portabilidad.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad