web-dev-qa-db-fra.com

Mettre à jour les branches Git depuis le maître

Je suis nouveau dans Git, et maintenant je suis dans cette situation:

  • J'ai quatre branches (maître, b1, b2 et b3).
  • Après avoir travaillé sur b1-b3, je me suis rendu compte que je devais modifier quelque chose sur le responsable de branche qui devrait figurer dans toutes les autres branches.
  • J'ai changé ce dont j'avais besoin dans master et ... voici mon problème:

Comment mettre à jour toutes les autres branches avec master code de branche?

601
Ionuț Staicu

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
551
Chris Kooken

Vous avez essentiellement deux options:

  1. 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.

  2. 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.

444
cmaster

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.

232
Michael J. Gray

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:

  • Ne rebasez pas les branches sur lesquelles vous avez collaboré.
  • Vous devez vous baser sur la branche sur laquelle vous allez fusionner, qui peut ne pas toujours être maître.

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.

48
Simon Bingham

@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.

15
bluemoon

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) ...

  1. Do rebase (aucune validation supplémentaire n'est effectuée dans la branche de sauvegarde).
  2. 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 ..,)

12
Sundar Gsv

Vous pouvez fusionner ou appliquer des commits individuels sur toutes les branches en utilisant git cherry-pick .

9
Brian Agnew