web-dev-qa-db-fra.com

meilleures pratiques dans Mercurial: branche vs clone, et fusion partielle?

... donc je me suis habitué aux trucs simples avec Mercurial (add, commit, diff) et j'ai découvert le fichier .hgignore (yay!) et ont appris à créer et à basculer entre les branches (branch, update -C).

J'ai cependant deux questions majeures:

  1. Si je suis dans la branche "Branch1" et que je souhaite retirer certaines des modifications de la branche "Branch2", mais pas toutes, comment dois-je procéder? Surtout si toutes les modifications sont dans un seul sous-répertoire. (Je suppose que je pourrais simplement cloner l'ensemble du référentiel, puis utiliser un outil de fusion de répertoires comme Beyond Compare pour choisir et choisir mes modifications. Il semble qu'il devrait y avoir un moyen d'isoler simplement les modifications dans un fichier ou un répertoire.)

  2. Basculer entre les branches 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 qui me manquent?

    une. si j'ai besoin d'agir sur deux versions/branches à la fois (par exemple, faire un diff de performance métrique)

    b. pour une sauvegarde (clone le référentiel sur un lecteur réseau dans un emplacement physiquement différent)

    c. pour faire le pick & choose merge comme je l'ai mentionné ci-dessus.

74
Jason S

J'utilise clone pour:

  • Succursales locales de courte durée
  • Clonage sur différentes machines de développement et serveurs

L'ancienne utilisation est assez rare pour moi - principalement lorsque 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 sert principalement à suivre les branches de différents développeurs afin qu'ils ne se dérangent pas. Juste pour clarifier ce dernier point:

  • Je continue de travailler sur mes changements et j'apporte des changements à mes collègues développeurs et ils tirent les miens.
  • Lorsque cela me convient, je fusionne TOUS les changements d'une (ou de toutes) de ces branches dans la mienne.

Pour les branches de fonctionnalité ou les branches à durée de vie plus longue, j'utilise des branches nommées qui sont partagées plus confortablement entre les référentiels sans fusion. Il se sent également mieux lorsque vous souhaitez fusionner de manière sélective.

Fondamentalement, je le vois de cette façon:

  • Les branches nommées servent à développer différentes branches ou versions de l'application
  • Les clones permettent de gérer différentes contributions à la même version de l'application.

C'est mon point de vue, mais c'est vraiment une question de politique.

50
Draemon

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

  1. "Je veux insérer certains, mais pas tous, les changements dans une branche différente dans celle-ci."
  2. "Je veux extraire la dernière version de certains (mais pas tous) des fichiers dans une branche différente dans celui-ci."

Si vous voulez dire l'élément 1, vous devriez vous pencher sur l'extension Transplant , en particulier sur l'idée de sélectionner quelques ensembles de modifications.

Si vous voulez dire l'élément 2, vous feriez ce qui suit:

  • Mettez à jour la branche dans laquelle vous souhaitez insérer les modifications.
  • Utilisation hg revert -r <branch you want to merge> --include <files to update> pour modifier le contenu de ces fichiers comme ils le sont dans l'autre branche.
  • Utilisation hg commit pour valider ces modifications dans la branche en tant que nouvel ensemble de modifications.

Quant à la question 2, je n'utilise jamais de clones de référentiel pour me ramifier, donc je ne sais pas. J'utilise des branches nommées ou des branches anonymes (parfois avec des signets).

29
Steve Losh

J'ai une autre option à explorer: les files d'attente Mercurial.

L'idée est d'avoir une pile de correctifs (sans commits, "vrais" correctifs) au-dessus de 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 de ceux-ci finit par être une nouvelle "fonctionnalité" comme vous le souhaitez probablement avec les branches. Après cela, vous pouvez appliquer le patch comme d'habitude (car c'est un changement). Les succursales sont probablement plus utiles si vous travaillez avec quelqu'un d'autre ...?

3
Harald Schilly