239 votes

git - sauter des validations spécifiques lors de la fusion

J'ai été en utilisant git pour environ un an maintenant et pense que c'est fantastique, mais je viens juste de commencer sur une deuxième version du projet et a commencé une nouvelle branche. Je me bats un peu avec la meilleure façon de traiter les choses à l'avenir.

J'ai deux branches appelé à dire master10 (v1) et master20 (v2). J'ai été faire des corrections de bugs de la v1 sur la branche master10, et le développement de nouveaux trucs de master20. Chaque fois que je fais une correction de bug-je les fusionner en v2 en vérifiant master20 et de faire "git merge master10". So far So good.

Maintenant, cependant, j'ai fait un changement dans la v1 que je ne veux pas dans la v2, mais je veux continuer à fusionner d'autres corrections de bugs. Comment puis-je indiquer à git d'ignorer ce commit (ou une série de commits), mais qu'à l'avenir, j'ai encore envie de fusionner d'autres corrections de bugs.

Je pensais que git rebase peut-être ce dont j'ai besoin, mais lire les doco et ma tête a explosé près.

Je pense que ce que je veux, c'est quelque chose comme un "git de synchronisation de la commande" qui indique à git que les deux branches sont maintenant synchro et à l'avenir, seulement fusionner les commits de cette synchronisation.

Toute aide appréciée.

Brad

335voto

araqnid Points 33350

Si vous voulez fusionner les la plupart, mais pas tous les commits de la branche "maint" à "maître", par exemple, vous pouvez le faire. Cela nécessite un peu de travail---- comme mentionné ci-dessus, l'habitude de cas d'utilisation est de fusionner le tout à partir d'une branche--- mais parfois, il arrive que vous faites un changement à une version qui ne devrait pas être intégré à l'arrière (peut-être que le code a été remplacé en master déjà), alors comment faites-vous représenter? Ici va...

Donc, supposons que maint a eu 5 modifications appliquées, et l'un de ceux (maint~3) est de ne pas être fusionnée dans le maître, bien que tous les autres devraient l'être. Vous faites cela en trois étapes: en fait, fusionner tout ce qui précède que, indiquer à git pour marquer maint~3 comme fusionné même quand il ne l'est pas, et puis de fusionner le reste. La magie est:

bash <master>$ git merge maint~4
bash <master>$ git merge -s ours maint~3
bash <master>$ git merge maint

La première commande fusionne tout avant votre gênants maint s'engager sur master. La valeur par défaut de fusion du journal de message d'expliquer que vous êtes à la fusion de "branche " maint' (première partie)".

La deuxième commande fusionne le gênants maint~3 commettre, mais le "-s nôtre" option indique à git d'une "fusion" de stratégie qui, en fait, fonctionne simplement en gardant l'arborescence vous se fusionnent et en ignorant le commit(s) vous êtes fusionner complètement. Mais il ne encore de faire une nouvelle fusion s'engager avec la TÊTE et maint~3 en tant que parents, de sorte que le graphe de révision dit maintenant que maint~3 est fusionné. Donc, en fait, vous devriez utiliser l'option-m de 'git merge", d'expliquer que maint~3 commettre est en fait d'être ignoré!

La commande finale fusionne simplement le reste de maint (maint~2..maint) en master de sorte que vous êtes tous synchronisés de nouveau.

50voto

Alexandre T. Points 109

À mon humble avis, la chose la plus logique à faire, c'est de fusionner tout, et puis l'utilisation de git revert (commit_you_dont_want) pour le supprimer.

Exemple:

git merge master
git revert 12345678

Si vous avez plusieurs "ignorer" s'engage, ou à modifier revenir message:

git merge master
git revert -n 123456
git revert -n abcdef
git commit -m "... Except commits 123456 and abcdef"

Alors votre histoire pourrait ressembler à:

| ... Except 123456 and abcdef
|\ Merge branch 'master' into 'your_banch'

Si vous avez des conflits de passer SEULEMENT ces "ignorer" s'engage, vous pouvez utiliser:

git merge master -X ours

Si votre version persisteront sur l'autre. Même sans les messages d'erreur, vous pouvez toujours "revenir" ces indésirables s'engage, parce qu'ils peuvent avoir d'autres changements qui ne sont pas en conflit, et vous ne voulez pas.

Si vous avez des conflits il englobe NON SEULEMENT les "ignorer" s'engage, vous devez les résoudre manuellement, et vous aurez probablement à résoudre lors du retour.

19voto

Dustin Points 35205

S’engage notamment ascendance. Vous ne pouvez pas fusionner une validation sans fusion préalable s’engage.

Vous pouvez choisir, bien sûr. C’est un flux très bien quand vous avez une branche qui est en mode maintenance.

1voto

wilhelmtell Points 25504

Créer un troisième volet pour les modifications souhaitées dans master10 mais pas dans master20. Toujours tenir compte master10 comme votre « maître », la branche plus stable de tous. La branche toutes les autres branches veulent garder synchronisé avec à tout moment.

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