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)
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.
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
Comme indiqué dans le noyau Linux officiel git pull
documentation :
Dans son mode par défaut,
git pull
est un raccourci pourgit fetch
suivi pargit merge
FETCH_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.
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.