Fusionner git repo dans la branche d'un autre repo

122

Compte tenu du repo Foo et du repo Bar. Je veux fusionner Bar avec Foo, mais uniquement dans une branche séparée, appelée baz.

git checkout -b baz <= mettez le repo Bar ici.

Trader de lait
la source

Réponses:

232

Vous ne pouvez pas fusionner un référentiel dans une branche . Vous pouvez fusionner une branche d'un autre référentiel dans une branche de votre référentiel local. En supposant que vous ayez deux référentiels, fooet bartous deux situés dans votre répertoire actuel:

$ ls
foo bar

Changez dans le fooréférentiel:

$ cd foo

Ajoutez le barréférentiel en tant que distant et récupérez-le:

$ git remote add bar ../bar
$ git remote update

Créez une nouvelle branche bazdans le fooréférentiel en fonction de votre branche actuelle:

$ git checkout -b baz

Fusionner la branche somebranchdu barréférentiel dans la branche actuelle:

$ git merge --allow-unrelated-histories bar/somebranch

( --allow-unrelated-historiesn'est pas nécessaire avant la version 2.9 de git)

larsks
la source
21
depuis git 2.9, vous devrez probablement ajouter --allow-unrelated-historiesà la commande git merge.
Drasill
2
Info sur le commentaire de @Drasill: github.com/git/git/blob/master/Documentation/RelNotes/…
GaTechThomas
10
Je n'ai aucune idée de ce que je fais et je ne peux pas vraiment lire ceci avec les espaces réservés foo / bar. Quelqu'un peut-il modifier cela avec des exemples réels (comme des liens, le cas échéant)?
rien333
Ooh, c'est génial. Je préférerais le fusionner dans un sous-répertoire. Ça ne peut pas être si différent, n'est-ce pas? Je préférerais que cette étape soit ajoutée.
macetw du
1
Je reçois des tonnes de conflits de fusion. Quoi qu'il en soit, vous pourriez forcer la fusion dans une nouvelle branche?
nomadoda
41

Mis à jour avec des commandes "réelles":

Commencez à partir de votre répertoire repo, assurez-vous que votre copie de travail est propre (aucun fichier modifié, ajouté ou supprimé).


Créez une nouvelle succursale:

git checkout -b <my-branch>

Ajoutez la télécommande secondaire, puis récupérez-la:

git remote add <repo-name> [email protected]:xxx/<repo-name>.git
git remote update

Fusionnez l'une de leurs succursales dans votre succursale actuelle:

git merge <repo-name>/<their-branch>


Si vous ne savez pas ce que <their-branch>vous voulez, allez-ymaster

Si vous êtes sûr de vouloir accepter toutes les modifications à distance et éviter les conflits ( écraser les vôtres ), vous pouvez spécifier -X theirscomme option git mergeà la dernière étape.

Si vous voulez l'ajouter dans un sous-répertoire, vous devriez probablement utiliser les sous-modules git

vinzdef
la source
3

En utilisant le guide de larsks, j'ai pu le faire en utilisant SourceTree.

  1. Création d'une branche dans le référentiel de destination
  2. Ajout du référentiel source en tant que distant, en appuyant sur le bouton Paramètres et en ajoutant le référentiel source.
  3. Les branches des deux référentiels s'affichent désormais dans la liste des branches. J'ai utilisé l'outil de fusion pour fusionner une branche du référentiel source vers la branche de mon nouveau référentiel de destination.
  4. Résolution de tous les conflits en utilisant SourceTree ou mon IDE
  5. Validez les changements dans ma branche.
  6. Supprimez le référentiel source de la liste distante à l'aide du bouton Paramètres.
TheBigSot
la source