Comment synchroniser une branche git avec master

276

Pour le moment, git fait ma tête, je ne peux pas trouver la meilleure solution pour ce qui suit.

Il y a deux branches, l'une appelée maître et l'autre appelée mobiledevicesupport . Je souhaite conserver mobiledevicesupport en tant que branche continue qui sera fusionnée / synchronisée avec la branche principale chaque fois que mobiledevicesupport est stable. Cela fusionnerait les modifications de mobiledevicesupport en master mais apporterait également toutes les modifications de master en mobiledevicesupport afin que la branche puisse continuer à être travaillée et les fonctionnalités améliorées ou modifiées. Cela doit fonctionner avec un référentiel central et plusieurs développeurs.

Veuillez un exemple de flux de travail similaires que d'autres personnes utilisent ou dites-moi simplement si cette idée est stupide et je devrais envisager d'autres options. Pour le moment, le flux de travail semble solide, mais je ne sais tout simplement pas comment faire fonctionner git de cette façon.

Merci, toute l'aide est très appréciée.

Mise à jour 1: si je devais fusionner le maître dans mobiledevicesupport et le support mobiledevice dans le maître, puis-je obtenir des validations répliquées dans les deux branches. Ou est git assez intelligent pour comprendre que j'ai tiré les dernières modifications de la branche A dans la branche B et ajouter la validation de fusion C à la branche B. Et j'ai tiré les dernières modifications de la branche B dans la branche A et ajouter la validation de fusion D à la branche UNE?

J'allais publier une image mais je n'ai pas assez de réputation pour elle, donc je suppose que l'illustration suivante devra faire. Deux branches fonctionnant en continu avec des fusions allant souvent dans les deux sens. La chose clé dont je ne suis pas sûr est de savoir comment git jouera les commits et remplira-t-il l'une des branches avec les commits de l'autre branche lors des fusions ou restera-t-il propre. J'ai déjà utilisé rebase, mais il semble que la branche soit terminée et que tous les commits aient été placés dans le maître, ou je me suis trompé. Merci du coup de main jusqu'à présent.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L
M. EZEKIEL
la source
1
Si vous cherchiez, comme moi, comment le faire avec le client GitHub : help.github.com/articles/merging-branches
cregox
1
Cette question m'a sauvé la vie pendant des siècles; Merci pour le grand effort de prendre le temps de poser cette merveilleuse question @M. EZEKIEL
DJphy
Dans le cas où vous travaillez sur une fourche, vous devez suivre help.github.com/articles/syncing-a-fork
koppor

Réponses:

417

oui fais juste

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

pour maintenir le support des appareils mobilisés en synchronisation avec le maître

puis lorsque vous êtes prêt à mettre mobiledevicesupport en master, fusionnez d'abord en master comme ci-dessus, puis ...

git checkout master
git merge mobiledevicesupport
git push origin master

et c'est tout.

l'hypothèse ici est que mobilexxx est une branche thématique avec un travail qui n'est pas encore prêt à entrer dans votre branche principale. Donc, ne fusionnez en maître que lorsque le support des appareils mobilisés est au bon endroit

concept47
la source
Cela me semble raisonnable, je suppose que je ne sais pas à quel point cela rendrait l'historique des validations, je mettrai à jour ma question avec un exemple de ce que je pense qui se passerait.
M. EZEKIEL
1
Vous aurez plusieurs "merge commits", essentiellement pour essayer de résoudre les différences entre vos branches. si vous êtes inquiet à ce sujet ET que vous êtes le seul à utiliser la branche, faites un "git rebase master" au lieu d'un "git merge master" ET N'APPUYEZ PAS SUR LES ENGAGEMENTS VERS LA TÉLÉCOMMANDE. Si vous le faites, vous allez vous retrouver à faire beaucoup de poussées de force (git push --force) vers origin / mobiledevicesupport parce que vous allez (probablement) toujours envoyer, que ce soit une histoire de commits qui ne correspondent pas à ce que la branche distante a. plus de détails ici git-scm.com/book/en/Git-Branching-Rebasing
concept47
Je crois que c'est la bonne réponse, cela ressemble exactement à ce que je veux. J'ai ajouté une illustration ci-dessus pour le rendre un peu plus clair, mais si ce que vous dites est vrai, cela devrait fonctionner exactement comme je le souhaite. Je vous remercie.
M. EZEKIEL
2
Lisez ceci pour comprendre pourquoi ce n'est pas spécialement un bon conseil: kentnguyen.com/development/visualized-git-practices-for-team/… . Cela a été écrit par le responsable de Git, il est donc probablement juste de dire qu'il sait de quoi il parle en ce qui concerne ce sujet particulier.
Dan Moulding du
2
Cela rend l'historique de validation désordonné, voir ma réponse le faire via rebase.
Gob00st
43

Chaque fois que vous souhaitez obtenir les modifications du maître dans votre branche de travail, procédez comme suit git rebase <remote>/master. S'il y a des conflits. les résoudre.

Lorsque votre branche de travail est prête, rebasez à nouveau, puis procédez git push <remote> HEAD:master. Cela mettra à jour la branche principale à distance (dépôt central).

euphoria83
la source
3
Quels sont les avantages / inconvénients de le faire de cette façon au lieu de celui indiqué dans la réponse acceptée?
Hampus Ahlgren
33
Sane jusqu'à ce que vous passiez 5 heures en enfer
rebase
21
Cela n'est vrai que si votre branche se trouve sur un référentiel privé. Ne jamais rebaser quelque chose qui a été poussé en amont. C'est pourquoi: git-scm.com/book/en/v2/…
Kleag
3
Le problème avec le rebasage étant une réécriture de l'historique est que les SHA du commit rebasé sont modifiés et donc vous ne pouvez pas compter sur la sortie de (par exemple) git branch --contains <commit>.
jnns
13

L'approche de concept47 est la bonne façon de le faire, mais je vous conseille de fusionner avec l'option --no-ff afin de garder votre historique de commit clair.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master
IwishIcanFLighT
la source
9

Oui, je suis d'accord avec votre approche. Pour fusionner mobiledevicesupport dans master, vous pouvez utiliser

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

De même, vous pouvez également fusionner master dans le support d'appareil mobile.

Q. Si la fusion croisée est un problème ou non.

R. Eh bien, cela dépend des validations effectuées dans la branche mobile * et la branche principale depuis la dernière synchronisation. Prenons cet exemple: après la dernière synchronisation, les validations suivantes se produisent sur ces branches

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

Supposons maintenant que le commit B ait apporté quelques modifications au fichier a.txt et que le commit D ait également apporté quelques modifications au a.txt. Voyons maintenant l'impact de chaque opération de fusion,

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.

Maintenant, il existe deux types de fusion possibles

  1. Fusion rapide
  2. Véritable fusion (nécessite un effort manuel)

Git essaiera d'abord de fusionner FF et s'il trouve des conflits non résolus par git. Il échoue la fusion et vous demande de fusionner. Dans ce cas, un nouveau commit se produira qui sera responsable de la résolution des conflits dans a.txt.

Donc, en fin de compte, la fusion croisée n'est pas un problème et, finalement, vous devez le faire et c'est ce que signifie la synchronisation. Assurez-vous de vous salir les mains en fusionnant les branches avant de faire quoi que ce soit en production.

sachinjain024
la source
1
Donc, la fusion croisée comme celle-ci n'est pas un problème?
M. EZEKIEL
La fusion croisée est ce que nous appelons la synchronisation et n'est pas un problème à moins que les validations dans les deux branches ne provoquent aucun conflit. Veuillez voir ma réponse mise à jour.
sachinjain024
3

La réponse acceptée via git merge fera le travail, mais laisse un héritage de validation compliqué, la bonne façon devrait être `` rebase '' via les étapes suivantes (en supposant que vous souhaitez conserver votre branche de fonctionnalités en sycn avec développer avant de faire le dernier push avant PR ).

1 git fetchdepuis votre branche de fonctionnalités (assurez-vous que la branche de fonctionnalités sur laquelle vous travaillez est à jour à ce jour)

2 git rebase origin/develop

3 En cas de conflit, résolvez-les un par un

4 utiliser git rebase --continueune fois tous les conflits résolus

5 git push --force

Gob00st
la source
1
C'est à la fois difficile à lire et difficile à comprendre. Veuillez mettre à jour votre réponse et utiliser le marquage de code approprié pour séparer vos commentaires des commandes.
not2qubit
2

Vous pensez dans la bonne direction. Fusionner le master avec mobiledevicesupport en continu et fusionner mobiledevicesupport avec master lorsque mobiledevicesupport est stable. Chaque développeur aura sa propre branche et pourra fusionner vers et depuis le support principal ou le support mobile en fonction de son rôle.

faisal
la source