git tirer du maître dans la branche de développement

497

J'ai une branche appelée dmgr2 (développement) et je veux tirer de la branche principale (site en direct) et incorporer tous les changements dans ma branche de développement. Y a-t-il une meilleure manière de faire cela? voici ce que j'avais prévu de faire, après avoir validé les modifications:

git checkout dmgr2
git pull origin master

cela devrait entraîner les changements en direct dans ma branche de développement, ou ai-je tort?

Matthew Colley
la source
1
Commencez par valider toutes vos modifications dans la branche dmgr2. puis pointez sur master 1.git checkout master puis obtenez la dernière modification 2.git pull 3.git merge dmgr2 4.git push -u origin master Et puis revenez à votre dmgr2 5.git checkout dmgr2
mat_vee
j'ai déjà engagé toutes mes modifications dans la branche dmgr2, désolé d'avoir oublié d'ajouter cela
Matthew Colley
1
si j'effectue l'étape 4, cela ne poussera-t-il pas mes modifications de développement en maître? je ne veux pas faire ça
Matthew Colley
Donc, ce que vous dites, c'est que vous voulez apporter les modifications de votre branche principale, dans votre branche de développement?
JcKelley
9
Passez à la devbranche avec a git checkout dev. Alors git pull --rebase origin master. Si vous êtes chanceux, il n'y aura pas de conflits et le développeur aura les dernières modifications de master.
JWW

Réponses:

726

Les étapes que vous avez répertoriées fonctionneront, mais il existe un moyen plus long qui vous offre plus d'options:

git checkout dmgr2      # gets you "on branch dmgr2"
git fetch origin        # gets you up to date with origin
git merge origin/master

La fetchcommande peut être exécutée à tout moment avant le merge, c.-à-d. Que vous pouvez échanger l'ordre de l'extraction et de l'extraction, car fetchva simplement sur la télécommande nommée ( origin) et lui dit: "donne-moi tout ce que tu as que je n'ai pas ", c'est-à-dire que tous les commits sur toutes les branches. Ils sont copiés dans votre référentiel, mais nommés origin/branchpour toute branche nommée branchsur la télécommande.

À ce stade , vous pouvez utiliser l' un spectateur ( git log, gitk, etc.) pour voir « ce qu'ils ont » que vous n'avez pas, et vice versa. Parfois, cela n'est utile que pour les sentiments flous chauds ("ah, oui, c'est en fait ce que je veux") et parfois il est utile pour changer complètement de stratégie ("whoa, je ne veux pas encore ce truc").

Enfin, la mergecommande prend le commit donné, que vous pouvez nommer origin/master, et fait tout ce qu'il faut pour introduire ce commit et ses ancêtres, dans la branche sur laquelle vous vous trouvez lorsque vous exécutez le merge. Vous pouvez insérer --no-ffou --ff-onlypour empêcher une avance rapide, ou fusionner uniquement si le résultat est une avance rapide, si vous le souhaitez.

Lorsque vous utilisez la séquence:

git checkout dmgr2
git pull origin master

la pullcommande ordonne à git de courir git fetch, puis l'équivalent moral de git merge origin/master. C'est donc presque la même chose que de faire les deux étapes à la main, mais il y a quelques différences subtiles qui ne vous concernent probablement pas trop. (En particulier, l' fetchétape exécutée par pullapporte uniquement origin/master , et elle ne met pas à jour la référence dans votre référentiel: 1 tout nouveau commit se termine uniquement par la FETCH_HEADréférence spéciale .)

Si vous utilisez la séquence la plus explicite git fetch origin(puis regardez autour de vous), puis la git merge origin/masterséquence, vous pouvez également mettre à jour votre propre local masteravec la télécommande, avec une seule fetchexécution sur le réseau:

git fetch origin
git checkout master
git merge --ff-only origin/master
git checkout dmgr2
git merge --no-ff origin/master

par exemple.


1 Cette deuxième partie a été modifiée - je dis «fixe» - dans git 1.8.4, qui met à jour de façon opportuniste les références de «branche distante». (C'était, comme le disent les notes de version, une décision de conception délibérée d'ignorer la mise à jour, mais il s'avère que plus de gens préfèrent que git le mette à jour. Si vous voulez l'ancienne branche distante SHA-1, elle est par défaut enregistrée dans , et donc récupérable à partir du reflog. Cela permet également une nouvelle fonctionnalité git 1.9 / 2.0 pour trouver les rebases en amont.)

torek
la source
28
Je demande juste un, euh, ami - comment feriez-vous pour annuler le premier bloc de code que vous avez ici (checkout / fetch / merge)?
Rich Bradshaw
10
@RichBradshaw: git checkoutest normalement non destructif et il n'y a normalement aucune raison d'annuler un git fetch, il semble donc que vous demandiez comment annuler un commit de fusion. La réponse est la même que pour les autres commits: soit git resetou git revert. Pour les modifications non publiées , git resetc'est généralement la meilleure méthode; pour les changements que d'autres ont déjà, git revertpeut-être mieux, mais consultez les conseils de Linus Torvald pour
annuler
2
@WeDoTDD: Je ne comprends pas la question. Il y a un certain nombre de commandes pour visualiser la validation graphique ( gitk, git log --graphavec ou sans --oneline, etc.) et vous pouvez git showou git show -mune fusion commettre ou utilisation git diff. Dans tous ces cas, vous spécifiez le programme lorsque vous entrez la commande sur la ligne de commande.
torek
1
@torek: a essayé votre façon de: git checkout branch puis git pull origin master, mais il a extrait toutes les modifications principales comme une seule modification qui devrait être validée à nouveau localement, au lieu de les extraire avec leur historique de validation et leurs messages, donc après la mise à jour locale master et passer à la branche, "git rebase master" fait le travail avec tous les conflits à résoudre, puis j'ajoute à "git pull --rebase" et gère à nouveau tous les conflits, puis git push origin branch pour que tout soit aligné. Je suppose qu'il devrait y avoir un meilleur moyen pour cela - ai-je raison?
user10556443
1
@torek: Je suis d'accord pour dire que le résultat que j'ai obtenu est un processus fastidieux qui m'oblige à gérer la répétition de rebase et de fusion et ... chaque fois que je veux obtenir une mise à jour du maître ... plus facile, a obtenu toutes les modifications sous une seule modification non validée à la succursale locale sans conserver l'ordre / l'historique de validation principal. Je serai heureux d'apprendre une meilleure suggestion sur la façon d'utiliser "chercher" et de garder une trace du maître sans avoir besoin d'utiliser "tirer" etc.
user10556443
14

Situation : Je travaille dans ma branche locale, mais j'aime garder les mises à jour dans la branche de développement nommée dev.

Solution : Habituellement, je préfère faire:

git fetch
git rebase origin/dev
greenridinghood
la source
15
Avec la clause de non-responsabilité habituelle, le rebasage ne doit être effectué que si la branche locale est locale uniquement, c'est-à-dire qu'elle n'a été poussée nulle part pendant la réécriture de l'historique.
Locus
8

Cela a fonctionné pour moi. Pour obtenir le dernier code du maître à ma branche

git rebase origin/master

Pratik Gaurav
la source
N'oubliez pas de git fetch origincommencer.
lenooh
3

Scénario :

J'ai la mise à jour du maître et la mise à jour de ma succursale, je veux que ma succursale garde la trace du maître avec le rebasage, pour que tout l'historique soit correctement suivi, appelons ma succursale Mybranch

Solution :

git checkout master    
git pull --rebase    
git checkout Mybranch    
git rebase master
git push -f origin Mybranch
  • besoin de résoudre tous les conflits avec git mergetool &, git rebase --continue, git rebase --skip, git add -u, selon la situation et les indices git, jusqu'à ce que tout soit résolu

(correction de la dernière étape, gracieuseté de Tzachi Cohen, l'utilisation de "-f" force git à "mettre à jour l'historique" sur le serveur)

maintenant la branche doit être alignée avec le maître et rebasée, également avec la mise à jour à distance, donc dans git log il n'y a pas de "derrière" ou "d'avance", il suffit de supprimer tous les fichiers de conflit local * .orig pour garder le dossier "propre"

user10556443
la source