Comment fusionner un maître distant avec une succursale locale

238

J'ai une branche locale d'un projet ("configUpdate") que j'ai extraite du projet de quelqu'un d'autre et j'ai fait un tas de changements dessus et j'aimerais fusionner les changements qu'ils ont apportés à ma branche locale.

J'ai essayé

git pull --rebase origin configUpdate

mais il n'a pas saisi les derniers changements - comment puis-je fusionner les deux? (aussi pour les points bonus, qu'est-ce que j'ai fait avec la pull --rebasecommande?)

Martyn
la source
Copie

Réponses:

354

Depuis votre branche de fonctionnalité (par exemple configUpdate) exécutez:

git fetch
git rebase origin/master

Ou la forme plus courte:

git pull --rebase

Pourquoi cela fonctionne:

  • git merge branchnameprend de nouvelles validations de la branche branchnameet les ajoute à la branche actuelle. Si nécessaire, il ajoute automatiquement un commit "Merge" en haut.

  • git rebase branchnameprend de nouveaux commits de la branche branchnameet les insère "sous" vos modifications. Plus précisément, il modifie l'historique de la branche actuelle de sorte qu'il soit basé sur la pointe de branchname, avec toutes les modifications que vous avez apportées en plus.

  • git pullest fondamentalement le même que git fetch; git merge origin/master.

  • git pull --rebaseest fondamentalement le même que git fetch; git rebase origin/master.

Alors pourquoi voudriez-vous utiliser git pull --rebaseplutôt que git pull? Voici un exemple simple:

  • Vous commencez à travailler sur une nouvelle fonctionnalité.

  • Au moment où vous êtes prêt à pousser vos modifications, plusieurs validations ont été poussées par d'autres développeurs.

  • Si vous git pull(qui utilise la fusion), vos modifications seront enterrées par les nouvelles validations, en plus d'une validation de fusion créée automatiquement.

  • Si vous préférez git pull --rebase, git fera avancer rapidement votre maître vers l'amont, puis appliquera vos modifications en haut.

Joey Adams
la source
J'ai fait cela sur la bonne branche mais je peux toujours voir des différences entre mes fichiers locaux et la branche principale distante du projet d'origine (même si cela dit que tout est à jour!) Peut-être que j'ai configuré le projet de manière incorrecte? Une façon de vérifier?
Martyn
1
@Martyn: Les différences devraient être vos changements locaux. Faites une autre fourchette de la branche distante et vérifiez si celle-ci a le bon contenu de fichier.
ZeissS
4
Je sais que c'est une vieille réponse, mais notez que vous préférerez peut-être faire un MERGE au lieu d'un rebase. Vous ne voulez pas faire de rebase si vous devrez plus tard fusionner avec un référentiel distant qui a déjà certaines de vos modifications.
Domino
1
Que diriez-vous (en supposant que vous êtes actuellement sur la branche configUpdate) ... git pull est fondamentalement la même chose que git fetch; git fusionner origine / master. <- PAS VRAI
Chris
@Chris: Dans quel sens n'est-ce pas vrai? L'hypothèse d'origine / maître comme amont? Ou git pull a-t-il été changé?
Joey Adams
81

J'ai découvert que c'était:

$ git fetch upstream
$ git merge upstream/master
Martyn
la source
6
Donc, si vous ne l'avez pas déjà compris, votre pull --rebasen'a pas fonctionné car originpointait votre fourchette. Cela aurait fonctionné si vous l'aviez fait git pull --rebase upstream/master.
Karl Bielefeldt
3
Essayez: git merge origin / master
Chris
Il me manquait une recherche, cette réponse l'a résolu pour moi.
nurettin
39

Passez à votre succursale locale

> git checkout configUpdate

Fusionnez le maître distant avec votre succursale

> git rebase master configUpdate

En cas de conflits, corrigez-les et pour chaque fichier en conflit, exécutez la commande

> git add [path_to_file / conflicted_file] (par exemple git add app / assets / javascripts / test.js)

Continuer le rebasage

> git rebase --continuer

Serge Seletskyy
la source
n'ayez pas peur d'utiliser rebase au lieu de fusionner passez un peu de temps à enquêter sur la différence si vous sentez l'écart dans ces questions
Serge Seletskyy
13

git rebase ne semblait pas fonctionner pour moi. Après git rebase, lorsque j'essaie de pousser les modifications dans ma branche locale, je continuais à recevoir une erreur ("indice: les mises à jour ont été rejetées car la pointe de votre branche actuelle se trouve derrière son homologue distant. Intégrez les modifications distantes (par exemple 'git pull. .. ') avant de pousser à nouveau. ") même après avoir tiré. Ce qui a finalement fonctionné pour moi, c'est la fusion de git.

git checkout <local_branch>
git merge <master> 

Si vous êtes un débutant comme moi, voici un bon article sur git merge vs git rebase. https://www.atlassian.com/git/tutorials/merging-vs-rebasing

AJC
la source