2010-03-08 17 views
9

Tengo un git-cpan-init de un repositorio que produjo un nodo raíz diferente de otro repositorio git ya establecido que encontré en github C:A:S:DBI. Desarrollé bastante en mi repositorio, y me gustaría fusionar o reproducir mis ediciones en un tenedor del repositorio más autorizado. ¿Alguien sabe como hacer esto? Creo que es seguro suponer que ninguno de los archivos contenidos en los archivos modificados es diferente, la base del código no ha sido desde el 8 de noviembre.¿Cómo puedo unir dos repositorios git sin una raíz común, donde todos los archivos modificados son los mismos?

Para mayor claridad, el repositorio git hub es el autorizado. Mi repositorio local es el que quiero subir al centro de git mostrado como un verdadero tenedor de git.

Respuesta

15

Debería poder agregar un control remoto a su repositorio existente (usando git remote add) para que pueda recuperar los contenidos del repositorio github en su repositorio existente.

Suponiendo que tiene un compromiso en su historial (llámelo O) y un compromiso en la rama remota (llámelo R) que corresponden al mismo conjunto de archivos (por ejemplo, ambos son importaciones de la misma versión) , entonces puedes simplemente hacer una rebase 'en'. Asumiendo que tiene la punta de los cambios controladas actualmente fuera:

git rebase --onto R O    # R and O are sha1 ids (possibly abbreviated) 

Esto reproduce todas sus confirmaciones desde O a la nueva raíz R cometió.

Una vez que haya hecho esto, si no está actualizado con la última rama maestra remota puede usar una rebase normal para llegar allí y el seguimiento del historial de git se ocupará de que los cambios se apliquen de forma tal que sentido.

git rebase <remote_name>/master # where <remote_name> is whatever 
            # you called the github remote when 
            # you used git remote add 
+1

I 'git remote agregue github ', luego 'I git checkout -b new_master', luego 'reinicio' --hard' that new_master en la CABEZA de' github/master', luego hice el 'git rebase --onto '. Dicho esto, "Primero, rebobinar la cabeza para reproducir tu trabajo en la parte superior ... Fast-forward new_master a 78672c96f2eb0717581f53b300c9243a5b446340" pero cuando veo 'git log' en mi' new_master' no veo los cambios y no están t en mi directorio de trabajo –

+0

todos los diagramas de rebase en 'git rebase', parecen mostrar raíces comunes. Esto no se aplica a mí. No estoy seguro de que pueda cambiar la base de una manzana en una naranja, por así decirlo. –

+0

¿Por qué 'reset' en' github/master'? Si haces esto, entonces no hay diferencia entre tu sucursal y el sha1 del nuevo maestro, por lo que la rebase se adelantará rápidamente y no aplicará ninguno de tus cambios. Tienes que rebase mientras estás en _tu_ rama. El '--onto' le dice a git que cruce ramas sin un ancestro común, pero el parámetro en debe estar en la rama sobre la que intentas construir y el parámetro restante debe tener algunas confirmaciones. –

Cuestiones relacionadas