origin - ¿Cómo volver a establecer la base de un repositorio de Git en otro?
git pull (3)
Tenía un repositorio de Git (A) que contiene el desarrollo de un proyecto hasta cierto punto. Luego perdí la memoria USB en la que estaba el repositorio A. Afortunadamente tuve una copia de seguridad de la última confirmación, así que pude crear un nuevo repositorio (B) más tarde, donde importé el estado del último proyecto y continúo el desarrollo. Ahora recuperé esa memoria USB perdida, así que tengo dos repositorios Git.
Creo que tengo que volver a ajustar el repositorio B en el repositorio A de alguna manera, pero no tengo idea de cómo hacerlo, tal vez usando fetch / pull y rebase?
En primer lugar, comience haciendo un clon de trabajo del repositorio A.
Luego simplemente jala hacia adentro desde B y fusiona. Es posible que prefiera crear una nueva rama, atraerla y fusionar las dos ramas. Es posible que también necesite un indicador de forzar; He hecho cosas como esta en Mercurial (injertando dos repositorios aparentemente no relacionados) y necesita "-f".
Si A y B no son el mismo repositorio (creaste B usando la última copia de trabajo que tenías), tienes que usar un graft para pretender que tienen un historial en común.
Supongamos que ha agregado A como control remoto para B según la respuesta de VonC , y el repositorio se ve así 1 :
~/B$ git tnylog
* 6506232 (HEAD, master) Latest work on B
* 799d6ae Imported backup from USB stick
~/B$ git tnylog A/master
* 33b5b16 (A/master) Head of A
* 6092517 Initial commit
Crea un injerto que diga la raíz de B que su padre es el jefe de A:
echo ''799d6aeb41095a8469d0a12167de8b45db02459c 33b5b16dde3af6f5592c2ca6a1a51d2e97357060'' /
>> .git/info/grafts
Ahora las dos historias anteriores aparecerán como una al solicitar el historial de B. Hacer que el injerto sea permanente es una simple git filter-branch
sin argumentos. Sin embargo, después de la rama de filtro, no estás en ninguna rama, por lo que deberías obtener la git branch -D master; git checkout -b master
git branch -D master; git checkout -b master
1 git tnylog
= git log --oneline --graph --decorate
Si A y B son el mismo repositorio (el primer SHA1 es común), usted puede:
- declarar A como un control remoto para B:
git remote add A /path/to/A
-
git fetch A
para actualizar todas las sucursales A remotas en el repositorio B -
git checkout dev
(en B, donde estás desarrollando) -
git rebase A/devBranch
para reproducir B (es decir, lo que desarrolla o vuelve a desarrollar a partir de su copia de seguridad) sobreA/devBranch
(el desarrollo que perdió). Un poco como esta pregunta SO .
El último paso te permite sincronizar tu desarrollador con el que perdiste.
Pero, en realidad, una vez que hayas obtenido de A, has terminado: B ahora contiene la historia de " todos " (la que perdiste y tu trabajo actual)