Je suis nouveau dans Git, et maintenant je suis dans cette situation:
master
et ... voici mon problème:Comment mettre à jour toutes les autres branches avec master
code de branche?
Vous avez deux options:
Le premier est une fusion, mais cela crée un commit supplémentaire pour la fusion.
Commander chaque branche:
git checkout b1
Puis fusionnez:
git merge Origin/master
Puis appuyez sur:
git Push Origin b1
Alternativement, vous pouvez faire une rebase:
git fetch
git rebase Origin/master
Vous avez essentiellement deux options:
Vous fusionnez. C'est en fait assez simple, et une opération parfaitement locale:
git checkout b1
git merge master
# repeat for b2 and b3
Cela laisse l’historique exactement comme il s’est passé: vous avez créé une fourche de maître, vous avez apporté des modifications à toutes les branches et vous avez finalement intégré les modifications de maître aux trois branches.
git
peut très bien gérer cette situation, elle est conçue pour les fusions qui se produisent dans toutes les directions, en même temps. Vous pouvez avoir confiance qu'il soit capable de rassembler tous les threads correctement. Peu importe que la branche b1
fusionne master
ou que master
fusionne b1
, la validation de fusion est identique à git. La seule différence est de savoir quelle branche finit par pointer vers ce commit de fusion.
Vous rebasez. Les personnes ayant un SVN ou un contexte similaire trouvent cela plus intuitif. Les commandes sont analogues au cas de fusion:
git checkout b1
git rebase master
# repeat for b2 and b3
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 devriez être conscient que c'est le cas. Considérez ce graphique de commit:
A --- B --- C --- D <-- master
\
\-- E --- F --- G <-- b1
La fusion résulte dans la véritable histoire:
A --- B --- C --- D <-- master
\ \
\-- E --- F --- G +-- H <-- b1
Le rebase, cependant, vous donne cette histoire:
A --- B --- C --- D <-- master
\
\-- E' --- F' --- G' <-- b1
Le fait est que les commits E'
, F'
et G'
n'ont jamais vraiment existé et n'ont probablement jamais été testés. Ils ne peuvent même pas compiler. Il est en fait assez facile de créer des commits insensés via une base, en particulier lorsque les modifications de master
sont importantes pour le développement de b1
.
La conséquence de ceci peut être que vous ne pouvez pas distinguer laquelle des trois commises E
, F
et G
a réellement introduit une régression, diminuant la valeur de git 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 au sujet de l'histoire. Et vous devriez au moins compiler tester les nouveaux commits.
git rebase master
est la bonne façon de faire cela. La fusion signifierait qu'un commit serait créé pour la fusion, alors que le rebasement ne le serait pas.
Si vous avez travaillé sur une branche de temps en temps, ou que beaucoup de choses se sont passées dans d'autres branches pendant que vous travailliez sur quelque chose, il est préférable de rebasculer votre branche sur master. Cela garde l'historique bien rangée et rend les choses beaucoup plus faciles à suivre.
git checkout master
git pull
git checkout local_branch_name
git rebase master
git Push --force # force required if you've already pushed
Remarques:
Il y a un chapitre sur la refonte de la fondation à l'adresse http://git-scm.com/book/ch3-6.html , ainsi que de nombreuses autres ressources sur le Web.
@Caster a fait la réponse la mieux élaborée. En bref:
git checkout master #
git pull # update local master from remote master
git checkout <your_branch>
git merge master # solve merge conflicts if you have`
Vous ne devez pas réécrire l'historique des branches, mais les conserver à l'état actuel pour pouvoir vous y référer ultérieurement. Lors de la fusion avec master, cela crée un commit supplémentaire mais bon marché. Les commits ne coûtent rien.
Pour mettre à jour d'autres branches telles que (backup) avec votre copie de branche principale. Vous pouvez suivre les deux méthodes (rebase ou fusion) ...
Fusionner les branches (il y aura une validation supplémentaire automatiquement dans la branche de sauvegarde).
Remarque: Rebase n’est rien d’autre que l’établissement d’une nouvelle base (une nouvelle copie).
git checkout backup git merge master git Push
(Répétez l'opération pour les autres branches, le cas échéant, comme backup2 & etc ..,)
git checkout backup git rebase master git Push
(Répétez l'opération pour les autres branches, le cas échéant, comme backup2 & etc ..,)
Vous pouvez fusionner ou appliquer des commits individuels sur toutes les branches en utilisant git cherry-pick .