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?
dev
branche avec agit checkout dev
. Alorsgit 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.Réponses:
Les étapes que vous avez répertoriées fonctionneront, mais il existe un moyen plus long qui vous offre plus d'options:
La
fetch
commande peut être exécutée à tout moment avant lemerge
, c.-à-d. Que vous pouvez échanger l'ordre de l'extraction et de l'extraction, carfetch
va 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ésorigin/branch
pour toute branche nomméebranch
sur 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
merge
commande prend le commit donné, que vous pouvez nommerorigin/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 lemerge
. Vous pouvez insérer--no-ff
ou--ff-only
pour 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:
la
pull
commande ordonne à git de courirgit fetch
, puis l'équivalent moral degit 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 parpull
apporte uniquementorigin/master
, et elle ne met pas à jour la référence dans votre référentiel: 1 tout nouveau commit se termine uniquement par laFETCH_HEAD
référence spéciale .)Si vous utilisez la séquence la plus explicite
git fetch origin
(puis regardez autour de vous), puis lagit merge origin/master
séquence, vous pouvez également mettre à jour votre propre localmaster
avec la télécommande, avec une seulefetch
exécution sur le réseau: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.)
la source
git checkout
est normalement non destructif et il n'y a normalement aucune raison d'annuler ungit 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: soitgit reset
ougit revert
. Pour les modifications non publiées ,git reset
c'est généralement la meilleure méthode; pour les changements que d'autres ont déjà,git revert
peut-être mieux, mais consultez les conseils de Linus Torvald pourgitk
,git log --graph
avec ou sans--oneline
, etc.) et vous pouvezgit show
ougit show -m
une fusion commettre ou utilisationgit diff
. Dans tous ces cas, vous spécifiez le programme lorsque vous entrez la commande sur la ligne de commande.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:
la source
Cela a fonctionné pour moi. Pour obtenir le dernier code du maître à ma branche
git rebase origin/master
la source
git fetch origin
commencer.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 :
(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"
la source