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 log
montre toujours que commit etdefault
branch 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 update
après avoir tiré pour déplacermaster
automatiquement 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?
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.
C'est exactement la raison d'utiliser des branches nommées au lieu de tout vider
default
.Vous ne pouvez pas supprimer quoi que ce soit dans Mercurial et vous ne devriez pas . Vous pouvez utiliser
hg strip
mais 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.Les chiffres ne veulent rien dire. Vous pouvez les ignorer s'ils vous déroutent.
Je n'ai pas utilisé TortoiseHG mais
hg pull -u
je ferai les deuxpull
etupdate
.Ce n'est pas grave, de nombreux utilisateurs de Mercurial ressentent la même chose à propos de Git (y compris moi).
la source
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:
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 .hg rollback
, mais je suppose que ce n'est pas le cas.hg bookmark --delete yourbookmark
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 .
la source
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é.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.
la source
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.
la source