Je suis nouveau sur Git, et maintenant je suis dans cette situation:
- J'ai quatre branches (master, b1, b2 et b3).
- Après avoir travaillé sur b1-b3, j'ai réalisé que j'avais quelque chose à changer sur le maître de branche qui devrait être dans toutes les autres branches.
- J'ai changé ce dont j'avais besoin
master
et ... voici mon problème:
Comment mettre à jour toutes les autres branches avec le master
code de branche?
git
git-branch
Ionuț Staicu
la source
la source
Réponses:
Vous avez deux options:
Le premier est une fusion, mais cela crée un commit supplémentaire pour la fusion.
Commander chaque succursale:
Fusionnez ensuite:
Appuyez ensuite sur:
Alternativement, vous pouvez faire un rebase:
la source
got push origin master
... n'a pas de sens. Vous ne changez pas de branche principale. Je pense que c'est une erreur avec 119 votes positifs: /git rebase master
c'est la bonne réponseVous avez essentiellement deux options:
Vous fusionnez. C'est en fait assez simple, et une opération parfaitement locale:
Cela laisse l'historique exactement tel qu'il s'est produit: vous avez dérivé de master, vous avez apporté des modifications à toutes les branches, et enfin vous avez incorporé les modifications de master dans les trois branches.
git
peut très bien gérer cette situation, il est conçu pour les fusions qui se produisent dans toutes les directions, en même temps. Vous pouvez lui faire confiance pour pouvoir réunir correctement tous les threads. Il ne se soucie simplement pas de savoir si la brancheb1
fusionnemaster
oumaster
fusionneb1
, la validation de la fusion ressemble tout de même à git. La seule différence est, quelle branche finit par pointer vers ce commit de fusion.Vous rebasez. Les personnes possédant un SVN ou des antécédents similaires trouvent cela plus intuitif. Les commandes sont analogues au cas de fusion:
Les gens aiment cette approche car elle conserve une histoire linéaire dans toutes les branches. Cependant, cette histoire linéaire est un mensonge, et vous devez être conscient qu'elle l'est. Considérez ce graphique de validation:
La fusion entraîne la véritable histoire:
Le rebase, cependant, vous donne cette histoire:
Le fait est que les engagements
E'
,F'
etG'
n'ont jamais vraiment existé, et n'ont probablement jamais été testés. Ils peuvent même ne pas compiler. Il est en fait assez facile de créer des commits absurdes via un rebase, surtout lorsque les changements dansmaster
sont importants pour le développement deb1
.La conséquence de cela peut être que vous ne pouvez pas distinguer lequel des trois commits
E
,F
et enG
fait introduit une régression, ce qui diminue la valeur degit bisect
.Je ne dis pas que vous ne devriez pas utiliser
git rebase
. Il a ses utilisations. Mais chaque fois que vous l'utilisez, vous devez être conscient du fait que vous mentez sur l'histoire. Et vous devez au moins compiler tester les nouveaux commits.la source
git checkout <source branch>
git pull
. Puis continuant avec ci-dessus:git checkout b1
...git merge
etgit rebase
. Il est impossible de les éviter.git rebase
a l'avantage de vous permettre de masquer plusieurs étapes de rebasage (c'est-à-dire de rebaser la même branche sur plusieurs validations différentes en séquence pour réduire le nombre de conflits à chaque étape). Néanmoins, le simple fait qu'une rebase ment sur l'histoire facilite beaucoup la baise dans une telle rebase à plusieurs étages ... C'est pourquoi je préfère toujours la fusion, même quand cela signifie que je dois encombrer l'histoire avec plusieurs validations de fusion .git rebase master
est la bonne façon de le faire. La fusion signifierait qu'un commit serait créé pour la fusion, contrairement au rebasage.la source
Si vous avez travaillé sur une branche de façon intermittente, ou que beaucoup de choses se sont produites dans d'autres branches pendant que vous travailliez sur quelque chose, il est préférable de rebaser votre branche sur master. Cela permet de garder l'historique bien rangé et rend les choses beaucoup plus faciles à suivre.
Remarques:
Il y a un chapitre sur le rebasage sur http://git-scm.com/book/ch3-6.html , et de nombreuses autres ressources sur le Web.
la source
@cmaster a fait la meilleure réponse élaborée. En bref:
Vous ne devez pas réécrire l'historique des branches au lieu de les conserver dans leur état réel pour de futures références. Lors de la fusion vers master, il crée un commit supplémentaire mais c'est bon marché. Les engagements ne coûtent pas.
la source
Pour mettre à jour d'autres branches comme (sauvegarde) avec votre copie de branche principale. Vous pouvez suivre les deux méthodes (rebaser ou fusionner) ...
Fusionner les branches (il y aura automatiquement un commit supplémentaire dans la branche de sauvegarde).
Remarque: Rebase n'est rien d'autre que l'établissement d'une nouvelle base (une nouvelle copie)
(Répétez l'opération pour les autres branches, le cas échéant, comme backup2, etc.)
(Répétez l'opération pour les autres branches, le cas échéant, comme backup2, etc.)
la source
Vous pouvez fusionner, ou vous pouvez appliquer des validations individuelles entre les branches en utilisant git cherry-pick .
la source
Il existe deux options pour ce problème.
1) git rebase
2) Git Merge
Seul diff avec au-dessus des deux en cas de fusion, aura un commit supplémentaire dans l'historique
1) Git Checkout Branch (B1, B2, B3)
2) git rebase origin / master (En cas de conflits, résolvez localement en faisant git rebase --continue)
3) git push
Alternativement, l'option de fusion git est similaire
1) git checkout "your_branch" (b1, b2, b3)
2) Git Merge Master
3) git push
la source
pour mettre à jour votre branche depuis le maître:
la source