63 votes

Comment rebaser un référentiel Git sur un autre?

J'ai eu un dépôt Git (A) qui contient le développement d'un projet, jusqu'à un certain point. Puis j'ai perdu la clé USB ce repo a était sur. Heureusement j'avais une sauvegarde du dernier commit, j'ai donc pu créer un nouveau référentiel (B) plus tard, où j'ai importé le dernier projet de l'état et de continuer le développement. Maintenant que j'ai récupéré qui a perdu la clé USB, j'ai donc deux dépôts Git.

Je pense que j'ai juste à rebase pensions de B sur Un repo en quelque sorte, mais je n'ai aucune idée de comment faire cela, peut-être l'aide d'extraire/pull et rebase?

68voto

Josh Lee Points 53741

Si A et B ne sont pas les mêmes pensions de titres (que vous avez créé B à l'aide de la dernière copie de travail, vous avez eu), vous devez utiliser un greffon de prétendre qu'ils ont une histoire commune.

Supposons que vous avez ajouté Une distance de B selon les VonC réponse, et l'opération ressemble à ceci1:

~/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

Créer une greffe de dire à la racine de B que sa mère est à la tête d'Un:

echo '799d6aeb41095a8469d0a12167de8b45db02459c 33b5b16dde3af6f5592c2ca6a1a51d2e97357060' \
 >> .git/info/grafts

Maintenant, les deux histoires ci-dessus apparaît lorsque vous demandez de l'histoire de B. Prise de la greffe permanent est une simple git filter-branch sans arguments. Après le filtre-branche, bien que, vous n'êtes pas sur n'importe quelle branche, de sorte que vous devriez git branch -D master; git checkout -b master.


1git tnylog = git log --oneline --graph --decorate

41voto

VonC Points 414372

Si A et B sont de la même repo (la première SHA1 sont communs), vous pouvez:

  • déclarer en tant que télécommande pour B: git remote add A /path/to/A
  • git fetch A à la mise à distance d'Une des branches de la B repo
  • git checkout dev (sur B, où vous êtes en développement)
  • git rebase dev A/devBranch de rejouer B (c'est à dire ce que vous développer ou re-développer à partir de votre sauvegarde) sur le dessus de l' A/devBranch (le développement, vous avez perdu). Un peu comme cette SORTE de question.

La dernière étape vous permet de synchroniser votre dev avec celui que vous avez perdu.
Mais en fait, une fois que vous avez récupérer à partir d'Un, vous êtes en fait: B contient maintenant le "tout" de l'histoire (celui que vous avez perdu et votre travail en cours)

2voto

crazyscot Points 6675

Tout d’abord, commencez par créer un clone de travail de repo A.

Ensuite, tirez simplement dessus et fusionnez. Vous préférerez peut-être créer une nouvelle branche, tirer dessus, puis fusionner les deux branches. Vous pourriez également avoir besoin d'un indicateur de forçage; J'ai fait des choses comme celle-ci dans Mercurial (greffer ensemble deux référentiels apparemment non liés) et il faut "-f".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X