Subversion: comment fusionner des révisions spécifiques en tronc lorsque plusieurs modifications consécutives sont effectuées dans une branche?
J'ai été en utilisant TortoiseSVN, svn, et subclipse et je pense comprendre les bases, mais il y a une chose qui m'énerve un peu: la Fusion introduit un code malveillant. Voici les étapes.
trunk/test.txt@r2
. Un fichier de test a été créé avec " a " et Un retour:
A
[EOF]
branches/TRY-XX-Foo/test.txt@r3
. Ramifié l' trunk
à TRY-XX-Foo
:
A
[EOF]
branches/TRY-XX-Foo/test.txt@r4
. Faites une modification non désirée dans TRY-XX-Foo
et engagé:
A
B (unwanted change)
[EOF]
branches/TRY-XX-Foo/test.txt@r5
. Fait une importante correction d'un bug dans TRY-XX-Foo
et engagé:
A
B (unwanted change)
C (important bug fix)
[EOF]
Maintenant, je voudrais fusionner seulement l'importante correction d'un bug avec le tronc. Donc, je lance de fusion pour la révision 4:5
. Ce que j'ai dans mon répertoire de travail est un conflit.
trunk/test.txt
:
A
<<<<<<< .working
=======
B (unwanted change)
C (important bug fix)
>>>>>>> .merge-right.r5
[EOF]
Contre ma volonté, Subversion a désormais inclus "modification non désirée" dans le coffre de code, et j'ai besoin de mauvaises herbes entre eux à la main. Est-il un moyen de fusionner spécifiés uniquement des révisions lorsque consécutives multiples modifications sont apportées dans la branche?
La partie du problème est que B (unwated changement) est inclus dans .fusion-droit et je ne peux pas dire la différence entre la révision d'où elle vient. J'ai l'habitude d'utiliser TortoiseMerge et voici à quoi il ressemble.
source d'informationauteur Eugene Yokota
Vous devez vous connecter pour publier un commentaire.
De fusionner uniquement les révisions 4,7, et 11-15 avec svnmerge:
Et régulièrement svn:
Le problème est que les deux svn
et TortoiseSVN est le traitement de la situation 2-voie de fusion. J'ai entendu parler de ce terme 3-voie de fusion, donc j'ai donné Au-Delà De Comparer un coup de feu. Avec une rapide mise en place avec TortoiseSVN, Modifier Conflit désormais afficher l'écran suivant. Ce n'est pas parfait, puisqu'il est encore nécessitant une intervention humaine, mais au moins je peux me dire quels sont les changements à venir à partir d'où.
Voir la capture d'écran.
Je crois que vous êtes y compris les révisions que vous voulez correctement, mais l'algorithme de fusion est, à défaut de trouver de la place pour insérer le voulait du changement et donc y compris la ligne du dessus aussi. Ici sont les mêmes étapes, mais avec une autre série de changements, et je crois qu'il fonctionne comme prévu à l'origine:
Bien de préciser une chose à propos de la fusion, c'est qu'il a fait 2 étapes.
Ce qui signifie qu'après la fusion est terminée, vous pouvez faire un manuel de diff contre la tête et l'autre branche pour s'assurer que la fusion était correcte.
Et si quelque chose n'allait pas avec elle, comme dans votre cas,
vous pouvez corriger manuellement avant de le commettre.
/Johan
Dans TortoiseSVN, vous devez spécifier uniquement les révisions que vous souhaitez fusionner. À la différence de la ligne de commande client où vous devez spécifier ex -r4:5 à fusionner les changements entre r4 et r5, vous n'avez qu'à spécifier '5' le numéro de révision de la fusion dans la TortoiseSVN boîte de dialogue fusionner. Si vous n'êtes pas sûr, toujours utiliser la boîte de dialogue de journal à partir de la boîte de dialogue fusionner et sélectionnez les révisions que vous souhaitez fusionner dans cette boîte de dialogue du journal (cliquez ensuite sur OK et les révisions sélectionnées seront automatiquement mis dans la boîte de dialogue fusionner).
Que pour résoudre votre conflit dans TortoiseMerge:
Selon la capture d'écran dans votre question, TortoiseMerge vous montre deux en conflit lignes (celles qui sont affichés sous la forme"????' dans la vue d'en bas).
Ce que vous voulez est d'inclure le changement 'C', mais pas 'B'?
Une autre chose que vous pourriez faire serait d'annuler manuellement le mauvais commit sur la branche, ce qui vous permettra ensuite de fusionner la branche vers le tronc, comme vous le feriez normalement.
TortoiseSVN
En utilisant TortoiseSVN vous ouvrez l'affichage de l'historique d'un fichier, sélectionnez la délinquance version, et choisissez "annuler les changements de cette révision" dans le menu du clic droit. Valider les modifications qu'il apporte à votre copie de travail et puis vous pouvez fusionner la branche facilement.
Ligne De Commande
Pour ce faire avec le client en ligne de commande vous effectuez un revers de fusion, (Ceci est pris à partir de la Pragmatique de Contrôle de la Source à l'aide de la Subversion livre) où vous fusionner les changements entre la délinquance de la version et de la version précédente dans la copie de travail du fichier. Puis comme ci-dessus vous auriez valider les modifications et peuvent alors se branche normalement. Dans votre exemple, vous devriez faire quelque chose comme:
Comme souligné par d'autres utilisateurs (je ne vais pas prendre le crédit pour s'en rendre compte parce que je n'ai pas), il peut être la banalité de cette fusion (c'est à dire le manque de contexte autour du changement) qui est source de confusion, les outils.
Je fais beaucoup de la fusion et, comme vous l'avez découvert, la fusion de l'outil fourni par la Tortue est terrible. Un outil de fusion est un must absolu si vous faites cela très souvent. Beyond Compare est mon préféré, mais il y a d'autres qui sont gratuits (Meld, KDiff3) et celles qui ne le sont pas (Araxis).
Vous remarquerez qu'au-Delà de Comparer a fait la bonne chose en fin de compte, même si elle vous fait manuellement vérifier l'exactitude!
Si vous ne voulez pas de la modification non désirée, ne pas fusionner la révision 4:5, mais juste de révision 5. Cela signifie que vous fusion et le changement engagé dans la révision 5.