67 votes

Git: Comment rebase de nombreuses branches (avec la même base de commettre) à la fois?

J'ai une maîtrise de la branche dans mon projet, que j'utilise pour tirer les changements d'autres personnes. De qui, d'habitude, j'ai plusieurs sujet branches sur lequel je travaille actuellement.

Ma question est: Est-il un moyen pour moi de tirer de nouveaux changements dans mon master, puis rebase l'ENSEMBLE de mon sujet branches sur cela à la fois?

C'est la situation:

        D--E topic1
       /
A--B--C  master
       \
        F--G topic2

Et je veux accomplir cela avec une seule commande (H sont de l'amont) :

 D' - E' topic1
/
 A--B--C--H master
\
 F'--G' topic2

Maintenant, je sais que je peux accomplir cela par la relocalisation topic1 et topic2 sur master, et je pourrais même écrire un script pour automatiser cela. Mais que faire si j'ai plusieurs autres branches, en créer de nouveaux et de supprimer les autres souvent, et je reçois en amont change tout le temps?

Cette opération (plusieurs rebases), quand il est fait à la main, est à la fois fatigant et sujette à erreur.

Est-il un moyen plus facile?

Merci!

22voto

araqnid Points 33350

Je suis assez convaincu qu'il n'y a pas un moyen pour ce faire. Rappelez-vous que "git rebase maître" peut aussi vous laisser tomber en arrière de la coquille avoir besoin de vous pour résoudre les conflits de fusion, donc si vous voulez écrire un script pour automatiser tout cela, vous devez tenir compte.

Vous pouvez assez facilement faire le suivi sur les secteurs qui ont besoin d'être mis à jour. Hmm, pour n'importe quelle branche, "git rev-liste de branche..maître" produira en sortie si la branche n'est pas à jour wrt (c'est à dire juste s'engage sur le dessus de la) maître. Si vous avez besoin d'une boucle sur toutes les têtes à l'exception de master de produire un rapport (nb "git show-branche" sera à peu près le faire):

git for-each-ref 'refs/heads/*' | \
  while read rev type ref; do
    branch=$(expr "$ref" : 'refs/heads/\(.*\)' )
    revs=$(git rev-list $rev..master)
    if [ -n "$revs" ]; then
      echo $branch needs update
      git diff --summary --shortstat -M -C -C $rev master
    fi
  done

Donc si vous sentez courageux, vous pourriez remplacer cette "git diff" avec quelque chose comme "git checkout branche $ & & git rebase maître" (ou peut-être juste "git pull --rebase" si vous avez le configurer). Je pense que vous auriez alors à vérifier l'existence d'un ".git/git rebase-appliquer" répertoire ou consulter l'index pour les non fusionné les fichiers ("git ls-fichiers -u") pour tester si nous avons été laissées en attente pour effectuer une fusion.

Bien sûr, si il n'y a pas de conflits, alors c'est facile... c'est la production de quelque chose qui fonctionne également lorsqu'il n'est pas facile c'est le problème :p

Et ce n'est pas nécessairement ce qui se passe si une de vos succursales est basé sur quelque chose d'autre... c'est pourquoi je l'ai mentionné à l'aide de "git pull --rebase" au lieu de cela, parce que ce serait cela, selon la direction de la configuration, pas aveuglément à partir du maître. Bien que la détection n'est pas basé sur la branche de configuration... peut-être qu'il serait plus facile juste pour vérifier chaque branche et de faire "git pull" et de laisser la direction de la configuration de tout gérer, y compris si rebase ou de fusion?

11voto

Tilka Points 531

Vous pouvez toujours écrire un shell en ligne de commande comme ceci:

for branch in topic1 topic2 topic3;do git rebase master $branch;done

Puisque le sujet branches vous souhaitez rebase va probablement changer au fil du temps, c'est un moyen rapide-et-dir^H^H^Hflexible solution :-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X