Je suis un utilisateur git confus par la branche de mercurial. Comment suis-je censé suivre les petits changements?

32

J'ai toujours utilisé git auparavant, mais je veux contribuer au python alors maintenant je dois apprendre mercurial et je trouve ça très frustrant.

J'ai donc créé quelques petits correctifs et je voulais les suivre en tant que commits dans mon référentiel mercurial local. Apparemment, il existe 4 façons de gérer la ramification en mercurial . 1 et 4 me paraissaient complètement ridicules, les branches nommées semblent être lourdes et je pense que je ne suis pas censé les utiliser pour des corrections rapides de 1 commit, j'ai donc utilisé des signets.

Maintenant, mon patch est rejeté et je veux supprimer l'une de mes branches de signets de mon référentiel. OK, dans git, je supprimerais simplement ma branche et l'oublierais, donc je supprime mon signet et maintenant j'ai les problèmes suivants:

  • TortoiseHG et hg logmontre toujours que commit et defaultbranch ont 2 têtes. Et si je comprends bien, vous ne pouvez pas supprimer les commits en hg sans plugins supplémentaires.

  • Mercurial a non seulement des hachages, mais aussi des numéros de révision. Comme j'ai ajouté quelques commits, tous les commits extraits après cela ont des numéros de révision différents du référentiel central principal.

  • Je le fais hg updateaprès avoir tiré pour déplacer masterautomatiquement mon signet vers le dernier commit, mais je n'ai pas trouvé de moyen de le faire dans TortoiseHG.

Qu'est-ce que je fais mal? Est-ce normal et attendu et dois-je simplement ignorer ces problèmes? Ou comment suis-je censé travailler avec mes succursales?

Anton Barkovsky
la source

Réponses:

22

Personnellement, pour votre scénario, je ne prendrais même pas la peine de créer une branche, sauf si je travaillais sur plusieurs modifications, chacune devant être acceptée par les développeurs principaux.

Il vous suffit de cloner leur référentiel et d'y travailler, puis de faire une demande d'extraction.

Si je devais utiliser une branche, je préfère utiliser des branches nommées. Ils ont été conçus dans ce but précis, là où les signets n'étaient pas. Je ne vois pas pourquoi tu le considérerais comme lourd.

Mercurial a une page entière sur son wiki décrivant différentes façons de " tailler les branches mortes ". L'option "Utilisation du clone" doit répondre à vos besoins.

Pour répondre à vos problèmes plus spécifiques ...

TortoiseHG et le journal hg montrent toujours que la branche commit et default a 2 têtes. Et si je comprends bien, vous ne pouvez pas supprimer les commits en hg sans plugins supplémentaires.

C'est une erreur que j'ai commise avec Mercurial quand j'étais nouveau. N'ayez pas peur de ces plugins supplémentaires. Certains d'entre eux sont des outils très puissants et souvent, ils sont ensuite intégrés au produit principal. Voilà comment fonctionne Mercurial. Si vous en avez besoin pour effectuer une tâche spécifique, procurez-vous-la et utilisez-la.

La révision de l'histoire est considérée comme une mauvaise chose dans le monde Mercurial, donc le produit vanille n'a pas toujours tout ce qu'un utilisateur Git pense qu'il devrait avoir, mais il y a beaucoup de plugins pour ceux qui veulent utiliser l'application mais ont des priorités différentes.

Mercurial a non seulement des hachages, mais aussi des numéros de révision. Comme j'ai ajouté quelques commits, tous les commits extraits après cela ont des numéros de révision différents du référentiel central principal.

Ne vous inquiétez pas des numéros de révision. Ils sont une question de commodité, pas plus. Les codes de hachage sont les identifiants importants qui passeront de repo à repo. Les numéros de révision sont incohérents entre les référentiels. Consultez Hg Init pour une bonne explication.

Les numéros de révision ne sont qu'un raccourci pratique et plus mémorable lorsque vous travaillez avec un seul dépôt.

Je fais la mise à jour hg après avoir tiré pour déplacer automatiquement mon signet principal vers le dernier commit, mais je n'ai pas trouvé de moyen de le faire dans TortoiseHG.

Lorsque vous utilisez TortoiseHG, utilisez le Workbench plutôt que les autres outils. Tout y est (presque). La mise à jour est dans les menus contextuels de révision. Ce n'est pas toujours intuitif, mais il y a un bon guide sur le lien ci-dessus et à mesure que vous vous habituez, vous finissez par cliquer avec un abandon confiant.

pdr
la source
J'ai certainement vu l'argument avant que les branches nommées appropriées signifient que l'édition de l'historique est moins nécessaire en hg
jk.
9

Apparemment, il existe 4 façons de gérer la ramification dans mercurial. 1 et 4 me paraissaient complètement ridicules, les branches nommées semblent être lourdes

Dans Mercurial, vous ne créez pas de branches. Chaque commit est effectivement une branche, tout commit peut avoir plusieurs parents et plusieurs enfants. Ce sont donc les quatre façons différentes d'organiser les mêmes entités.

Vous pouvez leur donner des noms différents, ce n'est pas obligatoire , mais c'est une bonne idée. Il n'y a rien de lourd dans les branches nommées - ce sont juste des métadonnées supplémentaires. Personnellement, je préfère les succursales nommées à toute autre chose dans n'importe quelle situation.

TortoiseHG et le journal hg montrent toujours que la branche commit et default a 2 têtes.

C'est exactement la raison d'utiliser des branches nommées au lieu de tout vider default.

Et si je comprends bien, vous ne pouvez pas supprimer les commits en hg sans plugins supplémentaires.

Vous ne pouvez pas supprimer quoi que ce soit dans Mercurial et vous ne devriez pas . Vous pouvez utiliser hg stripmais il n'est pas enregistré - vous avez simplement coupé une partie de votre dépôt local. Vous ne pouvez pas pousser cela, et si vous tirez d'un dépôt qui a la branche que vous avez supprimée localement, cela revient.

Mercurial a non seulement des hachages, mais aussi des numéros de révision. Comme j'ai ajouté quelques commits, tous les commits extraits après cela ont des numéros de révision différents du référentiel central principal.

Les chiffres ne veulent rien dire. Vous pouvez les ignorer s'ils vous déroutent.

Je fais la mise à jour hg après avoir tiré pour déplacer automatiquement mon signet principal vers le dernier commit, mais je n'ai pas trouvé de moyen de le faire dans TortoiseHG.

Je n'ai pas utilisé TortoiseHG mais hg pull -uje ferai les deux pullet update.

J'ai toujours utilisé git auparavant, mais je veux contribuer au python alors maintenant je dois apprendre mercurial et je trouve ça très frustrant.

Ce n'est pas grave, de nombreux utilisateurs de Mercurial ressentent la même chose à propos de Git (y compris moi).

un mec triste
la source
6

Même lorsque Mercurial et Git sont similaires, ils ont des conceptions différentes, peut-être que la différence de conception la plus importante est que dans Mercurial, la modification de l'historique n'est pas aussi flexible que dans git (car elle est découragée).

Réponse courte : peu importe si vous avez un petit nombre de modifications, vous pouvez toujours utiliser une branche. Si vous songez à la suppression de cette branche puis utilisez un signet pour que vous puissiez le supprimer plus tard et dépouiller les changements par la suite.

Tout d'abord, essayez de faire la lumière sur certaines des choses que vous mentionnez:

  • Les branches 1 et 4 sont considérées comme des branchements parce que chaque fois que vous vous engagez, vous créez effectivement une branche sans nom (s'il y a un autre commit en même temps à votre source / dépôt béni), qui est techniquement une branche. Dans la méthode 4, vous créez une nouvelle "tête" tandis que dans la méthode 1, vous ne l'êtes pas . Les têtes sont censées être fusionnées. Je suis d'accord que la méthode 1 est un peu idiote, mais certains semblent l'aimer ... pour les petits projets, je suppose.

  • Concernant la méthode 2, ce n'est pas que les branches sont lourdes, c'est qu'elles sont permanentes . Vous ne pouvez pas supprimer une branche à moins d'utiliser quelque chose comme l'extension de bande. Encore une fois, la philosophie de conception de Mercurial ne vise pas à modifier l'histoire (mais elle s'est améliorée).

  • En ce qui concerne les numéros de révision , ils ne sont qu'une référence locale et plus lisible pour vous d'utiliser toutes les commandes relatives aux révisions. Si vous aimez utiliser des hachages, vous pouvez toujours le faire. Les numéros de révision ne sont qu'un raccourci et ne sont pas pris en compte par Mercurial pour toutes les opérations internes entre différents référentiels.

Maintenant, pour répondre à vos autres questions:

  • Vous pouvez vérifier quelles têtes vous avez hg heads, si vous voyez plus de 2 têtes dans une seule branche nommée, il est préférable qu'elles soient fusionnées. C'est probablement là que se trouve votre signet .
  • Pour vous débarrasser d'une révision que vous venez de faire, vous pouvez le faire hg rollback, mais je suppose que ce n'est pas le cas.
  • Pour supprimer un signet, faites hg bookmark --delete yourbookmark
  • Vous serez heureux qu'il soit facile de couper des branches dans l'histoire. Examinez l' extension Rebase et l' opération Strip .
  • Mercurial est déjà fourni avec plusieurs extensions, mais elles ne sont pas activées par défaut . Allez dans n'importe quel dossier et faites un clic droit n'importe où pour obtenir le menu contextuel de TortoiseHG, allez dans Paramètres globaux puis Extensions: activez l'extension MQ et l'extension Rebase. Cela n'endommage en rien la compatibilité entre les référentiels.
  • Maintenant que vous êtes ici, vous pouvez soit:
    • Supprimer l'endroit où votre signet a commencé (cela résout probablement votre problème)
    • Pour une visualisation plus facile, vous pouvez peut-être rebaser vos modifications à l'avant, puis les supprimer par la suite. Je viens de mentionner le rebase car cela pourrait être quelque chose d'utile pour vous une autre fois.

De plus, dans git, vous pouvez avoir des "branches locales privées" car vous devez les pousser explicitement et vous pouvez les supprimer par la suite. Dans Mercurial, vous poussez tout ce que vous avez , cependant, si vous voulez éviter cela, vous pouvez utiliser la fonction Phases et marquer un ensemble de révisions comme secret . Les révisions secrètes ne seront pas poussées.

Enfin, vous ne faites rien de mal , gardez à l'esprit qu'il ne s'agit que de différents outils construits avec des mentalités légèrement différentes, qui se résument à peu près à: modifier l'historique (git) ou ne pas modifier l'historique (hg). Dans Mercurial, il est plus difficile de se tirer une balle dans le pied en modifiant l'histoire (spécialement avec Phases) et c'est pourquoi certains l'aiment mieux que Git .

ducofgaming
la source
Il n'existe aucun moyen de garantir que toutes les copies décentralisées des ensembles de modifications qui enregistrent une branche nommée ont été supprimées après l'exécution hg strip. Je suppose que l'on pourrait argumenter de la même manière au sujet des copies décentralisées des noms de branche Git, sauf que les branches nommées ont un espace de nom global et les noms de branche Git n'en ont pas. Et plusieurs têtes existent à cause des branches de nom. Il s'agit d'une erreur de conception infectieuse pour un VCS décentralisé.
Shelby Moore III
1

Je trouve qu'avec mercurial il est plus facile de ne pas se soucier des branches. Je trouve juste où dans l'histoire je veux éditer et créer des commits comme requis (aka branches anonymes). Parfois, les signets peuvent être utiles si je dois sauter d'une tête à l'autre dans des contextes différents, mais le plus souvent, je ne m'en soucie pas. Les branches nommées sont correctes pour les branches à longue durée de vie (branches de correction de bogues, branches de projet) mais pour les corrections à 1 ou 2 validations, elles ne sont pas le bon outil pour le travail.

L'astuce avec les branches anonymes est de définir leur phase sur "secret" si vous ne voulez pas les pousser, c'est-à-dire si vous voulez les garder locales. Si vous ne voulez les pousser, mais vous ne voulez plus commits basé sur eux, vous vous engagez juste une « branche --close » sur eux ce qui signifie qu'ils ne figurent plus dans la liste « têtes » et Mercurial cessera de se plaindre de plusieurs têtes sur cette branche.

bc.cam
la source
-1

Je pense que nous pouvons simplement utiliser un signet au lieu d'une branche; nous allons continuer à soutenir le produit de toute façon, et fusionner deux succursales à long terme serait un gros casse-tête.

Weijing Lin
la source