112 votes

Extrait tous les commits d'une branche, envoie les commits spécifiés à une autre

J'ai les branches suivantes:

  • master
  • production

et la distance suivant les branches:

  • origin/master
  • origin/production

J'ai un script qui récupère l' origin/master de la branche et obtient la diff de ce qui a changé depuis ma dernière opération d'extraction (log -p master..origin/master). Puis-je fusionner origin/master.

Les commits trouvé sont poussés à une révision du code de l'outil.

Je veux pousser le succès s'engage – et seulement – à la branche de production, et puis, bien sûr, à l' origin/production.

Comment puis-je le faire?

Aussi, j'ai 2 scripts en cours d'exécution: celui qui récupère origin/master, poussez s'engage détails à une base de données, et de fusion, et l'autre que je suis en train d'écrire qui devront pousser le succès de la commet.

J'aimerais avoir ces 2 scripts en cours d'exécution, tout en évitant les conditions de course/de conflit de fusion. Depuis que j'ai seulement envie de travailler avec spécifiée s'engage, il existe peut-être un moyen de se débarrasser de la s'engage à ce que je ne veux pas?

347voto

bdonlan Points 90068

Le terme je pense que vous êtes à la recherche d'une cerise choisir". Qui est, prendre un seul commis depuis le milieu de la branche et de l'ajouter à un autre:

A-----B------C
 \
  \
   D

devient

A-----B------C
 \
  \
   D-----C'

Bien entendu, cela peut être fait avec le git cherry-pick de commande.

Le problème avec cela engage, c'est que git estime s'engage à inclure toute l'histoire avant eux - donc, si vous avez trois s'engage de la sorte:

A-----B-----C

Et essayer de se débarrasser de B, vous devez créer un tout nouveau s'engager comme:

A-----------C'

Où C' est différent de l'algorithme SHA-1 ID. De même, le "cherry picking" un commit d'une branche à l'autre implique la génération d'un patch, puis de l'appliquer, perdant ainsi l'histoire de cette façon.

Ce changement de commettre Id pauses git de la fusion de la fonctionnalité parmi d'autres choses (si utilisé avec parcimonie, il y a des heuristiques qui cette). Plus important encore, il ignore les dépendances fonctionnelles - si C effectivement utilisé une fonction définie dans B, vous ne le saurez jamais.

Peut-être une meilleure façon de gérer cela serait d'avoir plus de précision, les branches. C'est, au lieu d'avoir juste un 'maître', 'featureA', 'bugfixB", etc. Effectuer la révision du code sur l'ensemble d'une branche à un temps où chaque branche est très concentré sur une seule chose - et puis fusionner une branche lorsque vous avez terminé. C'est le flux de travail que git est conçu pour, et ce que c'est bon :)

Si vous insistez sur la façon de traiter avec les choses au niveau des patchs, vous pouvez regarder la darcs - il considère un référentiel à un ensemble de correctifs, et donc le "cherry picking" devient l'opération fondamentale. Cependant, cela a son propre ensemble de problèmes, comme le fait d'être très lent :)

Edit: Aussi, je ne suis pas sûr de comprendre votre deuxième question, les deux scripts. Peut-être vous pourriez le décrire plus en détail, peut-être une autre question à garder les choses d'obtenir confus?

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