dvcs - le «clonage vers la branche» est-il un flux de travail courant?

9

J'ai récemment discuté de dvcs avec un collègue, car notre bureau commence à envisager de passer de TFS (nous sommes un magasin MS). Dans le processus, je suis devenu très confus car il a dit que bien qu'il utilise Mercurial, il n'avait pas entendu parler d'une commande de «succursale» ou de «paiement», et ces termes ne lui étaient pas familiers. Après s'être demandé comment il était possible qu'il ne les connaissait pas et expliquer comment les branches dvcs fonctionnent "en place" sur vos fichiers locaux, il était assez confus.

Il a expliqué que, tout comme le fonctionnement de TFS, quand il veut créer une "branche", il le fait par clonage, donc il a une copie entière de son dépôt. Cela m'a paru vraiment étrange, mais l'avantage que je dois concéder est que vous pouvez regarder ou travailler sur deux branches simultanément car les fichiers sont séparés.

En cherchant sur ce site pour voir si cela a été demandé avant de voir un commentaire selon lequel de nombreuses ressources en ligne font la promotion de cette méthodologie "clone to branch", au grand dam de l'affiche. Est-ce réellement courant dans la communauté dvcs? Et quels sont les avantages et les inconvénients de suivre cette voie? Je ne le ferais jamais car je n'ai pas besoin de voir plusieurs branches à la fois, la commutation est rapide et je n'ai pas besoin de tous les clones pour remplir mon disque.

Tesserex
la source
7
ceci est un maintien des workflows CVS et SVN, rappelez-vous "pour un marteau, tout ressemble à un clou"
1
@JarrodRoberson - Seulement si vous vous limitez au gitfonctionnement. Avec hgceci est généralement le premier workflow enseigné et il est toujours très utile.
Mark Booth

Réponses:

3

Mis à part l'avantage / l'inconvénient général de pouvoir voir les deux branches, je pense qu'il y a un avantage spécifique à Mercurial à le faire.

Si vous clonez pour créer une branche, vous pouvez supprimer le clone plus tard si vous ne souhaitez pas conserver vos modifications. Si vous décidez de les fusionner, le fait que vous ayez décidé de séparer vos modifications de cette manière n'est visible par personne d'autre.

En revanche, si vous utilisez hg branchpour créer une nouvelle branche nommée, le nom de la branche est enregistré dans l'historique lorsque vous vous engagez, est visible pour tout le monde et doit être assez unique afin d'éviter toute confusion potentielle plus tard. Cela peut ne pas être approprié si votre branche est destinée au développement d'une fonctionnalité expérimentale ou à une modification qui pourrait s'avérer minime.

Si vous utilisez des branches nommées pour gérer les versions publiées de votre logiciel et que vous les utilisez également pour développer des fonctionnalités à court terme ou des corrections de bogues, il est facile de devenir confus car il n'y a aucun moyen (en dehors des conventions de dénomination) de garder ces deux types de branches séparées.

http://mercurial.selenic.com/wiki/StandardBranching explique cela plus en détail. Il convient également de mentionner que depuis Mercurial 1.8, il est possible de créer un signet ( hg bookmark) - un nom jetable pour une branche de courte durée. Les signets peuvent être poussés, tirés, déplacés et supprimés.

benj
la source
2
Je n'ai pas beaucoup utilisé Mercurial mais Git n'a pas ce problème. Je peux créer des succursales toute la journée localement, fusionner pour développer une succursale, pousser et personne n'a à regarder les noms de mes succursales.
Andrew T Finnell
3
@AndrewFinnell: Cela ne correspondait pas vraiment à la question, mais je voulais dire que ce n'est pas nécessairement un problème - il y a aussi des avantages à la façon dont les branches nommées dans le travail Mercurial. Par exemple, vous pouvez voir sur quelle branche une validation a été effectuée à l'origine, ce qui peut être utile à connaître.
benj
1
@AndrewFinnell - Les branches nommées sont quelque chose qui me manque vraimentgit , car je m'y suis habitué hg. De plus, devoir me souvenir explicitement git branchchaque fois que je veux créer une branche est ennuyeux, par rapport à hgla création automatique de branches sans nom.
Mark Booth
Vous pouvez toujours utiliser l'extension de bande fournie pour supprimer votre branche dans hg. Mercurial supporte mieux la modification de l'histoire de nos jours grâce à l'utilisation de "phases"
dukeofgaming
2

Chaque fois que vous effectuez un commit dans un DVCS, vous créez techniquement une branche dans l'histoire, chaque fois que vous la repoussez dans le dépôt béni que vous réintégrez, voici la partie intéressante:

  • Si personne n'a fait de changement pendant votre commit, cela ne ressemblera pas à une branche dans le DAG (graphique acyclique dirigé)
  • Si quelqu'un d'autre a effectué un changement pendant votre commit, il ressemblera à une branche dans le DAG, uniquement sans nom

Rappelez-vous que le bouton "fork" dans Bitbucket / github?, Forking peut être considéré comme synonyme de branchement, et ce que fait le bouton "fork" n'est qu'un clone de ce référentiel sur votre compte.

Le seul avantage du «clonage vers une branche» est de pouvoir travailler simultanément à deux moments de l'histoire, et ironiquement pour votre collègue, c'est un workflow commun pour travailler sur différentes branches en même temps (sans avoir à faire des allers-retours) ).

Dites à votre collègue d'apprendre à créer une branche , c'est très simple, ici, ayez un tutoriel:

D:\>mkdir lol

D:\>cd lol

D:\lol>hg init

D:\lol>hg branch
default

D:\lol>touch lol

D:\lol>hg add lol

D:\lol>hg commit -m "lol"

D:\lol>hg branch lol
marked working directory as branch lol
(branches are permanent and global, did you want a bookmark?)

D:\lol>hg branches
default                        0:35d562fafaf2

D:\lol>echo "lol" > lol

D:\lol>hg commit -m "New lol branch"

D:\lol>hg branches
lol                            1:9384f923e78d
default                        0:35d562fafaf2 (inactive)

D:\lol>hg branch
lol

D:\lol>hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
default

D:\lol>hg update lol
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
lol

D:\lol>hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
default

D:\lol>hg merge lol
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

D:\lol>hg commit -m "lol merge"

D:\lol>hg branch
default

D:\lol>hg update lol
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
lol

Le «clonage vers une branche» est logique lorsque vous travaillez dans différentes branches en même temps ou lorsque vous souhaitez essayer une expérience sans créer de branche permanente dans l'historique tout en étant capable de la réintégrer dans une branche déjà existante. .

Personnellement, je n'aime pas cette pratique et préfère faire des succursales et les fermer si nécessaire. Voici comment vous procédez:

D:\lol>hg branches
default                        2:46420aca1612
lol                            1:9384f923e78d (inactive)

D:\lol>hg branch
lol

D:\lol>hg commit --close-branch -m "Obai, glorious lol branch"

D:\lol>hg branches
default                        2:46420aca1612

D:\lol>hg branch
lol

D:\lol>hg update default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branches
default                        2:46420aca1612

D:\lol>hg branches --closed
default                        2:46420aca1612
lol                            3:4b79c577e029 (closed)

J'espère que cela dissipe vos doutes sur les branchements DVCS, ici les branches ne font plus peur.

dukeofgaming
la source
0

Je ne m'inquiéterais pas personnellement du remplissage du code sur mon disque ... d'abord, c'est juste du code, et deuxièmement, vous n'allez pas garder tous vos clones pour toujours.

Cette méthodologie est promue dans de nombreuses ressources en ligne, en particulier pour Hg. Je ne l'ai jamais vu utilisé en production, dans les environnements CI, il est beaucoup plus courant d'avoir des branches de fonctionnalités de courte durée que des clones de référentiel supplémentaires. Je ne vois pas l'avantage de faire cela, si quelque chose va rendre votre histoire plus confuse, pas moins, et cela ne vous rapporte rien non plus. Si vous souhaitez regarder votre nouveau code côte à côte avec l'ancien code, vous pouvez utiliser un outil de diff / fusion pour regarder les deux validations côte à côte, avec l'avantage supplémentaire que vous verrez vos modifications mises en évidence.

philosodad
la source
Je l'ai beaucoup utilisé en production, avec hg. Être capable de pousser et de tirer entre plusieurs hgréférentiels peut être un outil collaboratif vraiment puissant. Seul le fait de pouvoir extraire des gitréférentiels non nus peut limiter considérablement vos options avec ce type de flux de travail.
Mark Booth