web-dev-qa-db-fra.com

différence entre git merge Origin / master et git pull

Je travaille sur une branche locale "BDD-local" et j'aimerais obtenir les changements des autres développeurs. Les autres développeurs utilisent leur propre branche et une fois qu'ils sont satisfaits des tests unitaires, ils poussent les modifications vers le référentiel distant (origine/maître).

Je parcourais plusieurs articles ici et obtenais des informations contradictoires. Peu de gens parlent d'utiliser:

git fetch Origin
git merge Origin/master

Certains pensent que "git pull" devrait obtenir les changements.

Un de nos développeurs a demandé d'utiliser 'git merge Origin/master' sans 'git fetch'

Quelqu'un sait-il laquelle de ces options est la meilleure? J'ai essayé 'git pull' sur ma branche locale mais cela ne semble pas fonctionner. Mais si je fais git pull sur le maître local, cela fonctionne bien (mais je veux que cela fonctionne pour la branche locale)

42
vijay pujar

récupérer, fusionner et tirer

git fetch et git merge Origin/master récupérera et intégrera les modifications à distance. Permettez-moi d'expliquer un scénario courant. Origin/master est à C. Quelqu'un a poussé D. Vous avez travaillé sur E & F. Notez que vous ne verrez pas D dans votre référentiel local jusqu'à ce que vous exécutiez git fetch.

   Origin/master
    v
A-B-C-E-F < master
     \
     (D) < master on remote

Maintenant, vous exécutez git fetch. Vous pouvez maintenant voir D et Origin/master est mis à jour pour correspondre au référentiel distant qu'il suit.

A-B-C-E-F < master
     \
      D < Origin/master, master on remote

Maintenant, vous exécutez git merge, vous donnant ceci:

A-B-C-E-F
     \   \
      D---G < master
      ^
    Origin/master, master on remote

Alors maintenant, vous avez intégré vos modifications sur master (E, F) avec les nouveaux commits sur Origin/master (D).

git pull est simplement un raccourci pour les étapes ci-dessus.

git fusionner sans aller chercher

Fonctionnement git merge Origin/master sans le git fetch est inutile. Sans un git fetch, votre référentiel local n'est au courant d'aucune modification potentielle sur le référentiel distant et Origin/master n'aura pas été déplacé. Vous êtes donc dans cet état, où D est uniquement sur la télécommande et non présent localement:

   Origin/master
    v
A-B-C-E-F < master
     \
     (D) < master on remote

Étant donné que votre référentiel local n'a pas D, un git merge Origin/master donnera simplement:

Already up-to-date.

Parce que, en ce qui concerne votre référentiel local, master a déjà tout dans Origin/master.

Quoi de mieux?

Aucune de ces réponses. :)

git fetch
git rebase Origin/master master

ou un raccourci, git pull -r, mais personnellement je préfère voir les changements avant de rebaser.
Cela rejouera vos modifications sur master (E, F) par-dessus Origin/master (D) sans commit de fusion. Il donne:

A-B-C-D-E'-F' < master
      ^
   Origin/master, master on remote

Notez que tout est sur une seule ligne, vous êtes prêt à pousser et l'histoire ne ressemble pas à un bracelet d'amitié.

Un avertissement - ne remettez jamais en cause les validations qui ont déjà été poussées. Notez que E & F est devenu E '& F' après le rebasage. Les validations sont entièrement réécrites, avec un nouveau SHA et tout. Si vous rebase des validations qui sont déjà publiques, les développeurs verront leur historique réécrit pour eux quand ils tireront. Et c'est affreux, et tout le monde vous donnera des yeux mauvais et vous fuira.

70
Mike Monkiewicz

git pull est le même que git fetch + git merge

La commande

git pull <remote> <branch>

est vraiment la même chose que

git fetch <remote>
git merge <remote>/<branch>

Il n'y a donc pas de différence pratique entre

git pull Origin master

et

git fetch Origin
git merge Origin/master

Documentation

Comme indiqué dans le noyau Linux officiel git pull documentation :

Dans son mode par défaut, git pull est un raccourci pour git fetch suivi par git mergeFETCH_HEAD.

Plus précisément, git pull exécute git fetch avec les paramètres et appels donnés git merge pour fusionner les têtes de branche récupérées dans la branche actuelle.

Lecture recommandée

47
user456814

UNE git pull va exécuter un git fetch puis un git merge. Si vous souhaitez mettre à jour votre référentiel local avec un référentiel distant, c'est ce que vous exécuteriez.

UNE git fetch va importer des validations à partir d'un référentiel distant sans les fusionner, ce qui vous donne la possibilité de les revoir avant de les intégrer.

6
Peter Foti