74 votes

Meilleures pratiques en mercurial: branche vs. clone, et fusions partielles?

...donc je me suis habitué aux choses simples avec Mercurial (add, commit, diff) et j'ai découvert le fichier .hgignore (hourra!) et j'ai pris le coup de main pour créer et basculer entre les branches (branch, update -C).

J'ai cependant deux questions majeures :

  1. Si je suis dans la branche "Branche1" et que je veux récupérer certaines mais pas toutes les modifications de la branche "Branche2", comment ferais-je ? Particulièrement si toutes les modifications sont dans un sous-répertoire. (Je suppose que je pourrais simplement cloner le dépôt entier, puis utiliser un outil de fusion de répertoires comme Beyond Compare pour choisir mes éditions. Il semble qu'il devrait y avoir un moyen d'isoler simplement les modifications dans un fichier ou un répertoire, cependant.)

  2. Passer d'une branche à l'autre avec update -C semble si facile, je me demande pourquoi je prendrais la peine d'utiliser clone. Je ne peux penser qu'à quelques raisons (voir ci-dessous) -- y a-t-il d'autres raisons que j'ignore ?

    a. si j'ai besoin d'agir sur deux versions/branches en même temps (par exemple, faire une différence de métriques de performance)

    b. pour une sauvegarde (clone le dépôt sur un lecteur réseau dans un emplacement physiquement différent)

    c. pour faire la fusion de choix mentionnée ci-dessus.

50voto

Draemon Points 15448

J'utilise le clonage pour :

  • Les branches locales de courte durée
  • Cloner sur différentes machines de développement et serveurs

L'utilisation précédente est assez rare pour moi - principalement quand j'essaie une idée que je pourrais vouloir abandonner totalement. Si je veux fusionner, je veux fusionner TOUTES les modifications. Ce type de branchement est principalement pour suivre les branches des différents développeurs afin qu'ils ne se dérangent pas mutuellement. Juste pour clarifier ce dernier point :

  • Je continue à travailler sur mes modifications et je tire les modifications de mes collègues et eux tirent les miennes.
  • Quand cela me convient, je fusionnerai TOUTES les modifications de l'une (ou de toutes) de ces branches dans la mienne.

Pour les branches des fonctionnalités, ou les branches de plus longue durée, j'utilise des branches nommées qui sont plus facilement partagées entre les dépôts sans fusion. Cela se "sent" aussi mieux lorsque vous souhaitez fusionner sélectivement.

Essentiellement, je le vois de cette manière :

  • Les branches nommées sont pour le développement de différentes branches ou versions de l'application
  • Les clones sont pour gérer les différentes contributions à la même version de l'application.

C'est ma façon de voir les choses, même si c'est vraiment une question de politique.

3 votes

Pourquoi cela a-t-il été accepté et obtenu autant de votes alors que cela a clairement manqué le point de la question? Il ne répond pas à 1 et il ne répond pas non plus à 2 alors que la réponse de Steve est en fait bien précise.

3 votes

@ mare espère que cela a été utile pour l'OP. Parfois, il y a plus d'une perspective sur une question, et stackoverflow est conçu pour permettre à la réponse qui répond le mieux au problème de l'OP d'obtenir du crédit (en étant acceptée) et à la réponse la plus utile pour la communauté d'obtenir du crédit (à travers les votes positifs). Une réponse utile n'est pas toujours la réponse la plus directe, tant qu'elle répond à la raison sous-jacente de la question. Dans ce cas, des personnes m'ont posé des questions similaires dans la vie réelle et les informations que j'ai partagées ici ont été les plus utiles pour eux, alors j'ai pensé que cela pourrait aussi être utile ici.

2 votes

@mare, j'ai voté pour cela car je suis arrivé sur cette page via Google et cela a résolu ma question.

29voto

Steve Losh Points 11958

Pour la question 1, vous devez être un peu plus clair sur ce que vous entendez par "changements". Lequel de ceux-ci voulez-vous dire :

  1. "Je veux extraire certains, mais pas tous, des jeux de modifications d'une autre branche dans celle-ci."
  2. "Je veux extraire la dernière version de certains, mais pas tous, des fichiers d'une autre branche dans celle-ci."

Si vous voulez dire le point 1, vous devriez jeter un œil à l'extension Transplant, en particulier l'idée de choisir quelques jeux de modifications.

Si vous voulez dire le point 2, vous devriez faire ce qui suit :

  • Met à jour la branche dans laquelle vous voulez extraire les modifications.
  • Utilisez hg revert -r --include pour changer le contenu de ces fichiers pour les mettre à jour dans l'autre branche.
  • Utilisez hg commit pour valider ces modifications dans la branche en tant que nouveau jeu de modifications.

En ce qui concerne la question 2, je n'utilise jamais de clones de dépôts pour mes branches, donc je ne sais pas. J'utilise des branches nommées ou des branches anonymes (parfois avec des signets).

3voto

Harald Schilly Points 750

J'ai une autre option à vous proposer : les queues Mercurial.

L'idée est d'avoir une pile de correctifs (pas de commits, de "vrais" correctifs) sur votre répertoire de travail actuel. Ensuite, vous pouvez ajouter ou supprimer les correctifs appliqués, en ajouter un, le supprimer, en ajouter un autre, etc. Un seul correctif ou un sous-ensemble d'entre eux finit par constituer une nouvelle "fonctionnalité" comme vous le voulez probablement avec les branches. Ensuite, vous pouvez appliquer le correctif comme d'habitude (puisque c'est un changement). Les branches sont probablement plus utiles si vous travaillez avec quelqu'un d'autre... ?

2 votes

Je dois dire que malgré mon envie d'aimer MQ et que cela semblait être une excellente idée, en pratique je les ai trouvé complètement inutilisables. Travailler sur deux machines différentes était pénible - enlevant ainsi un des principaux avantages du contrôle de source.

0 votes

Cela a été ma plainte. Vous ne pouvez toujours pas ajouter le dépôt ./.hg/patches dans votre fichier ./.hgsub. J'utilise MQ lorsque j'ai des personnalisations pour un client spécifique en plus de quelque chose de générique, mais ensuite je me retrouve avec plusieurs dossiers de patch nommés (patch-clienta, patch-clientb, etc). C'est bien pour moi de travailler seul, mais je lutte toujours pour voir comment nous pourrions intégrer MQ de manière praticable dans mon travail quotidien. Cloner pourrait signifier cloner le dépôt principal et 3 ou 4 dépôts de files d'attente de patch.

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