Premiers pas avec Mercurial

Installation et configuration

Vous pouvez [télécharger Mercurial][1] depuis le site Web du projet, et il existe des [utilitaires graphiques][2] pour Windows, Linux et OSX si vous préférez cela à une interface de ligne de commande. La plupart des gestionnaires de packages Unix incluent Mercurial, par exemple sur Debian/Ubuntu :

$ apt-get install mercurial

Vous pouvez vérifier que Mercurial est installé en exécutant :

$ hg --version

Installer

Mercurial est prêt à l’emploi, mais vous souhaiterez probablement configurer Mercurial pour savoir qui vous êtes avant d’aller plus loin. Pour associer un nom d’utilisateur à vos commits, modifiez ~/.hgrc (ou mercurial.ini dans votre répertoire personnel sous Windows) et ajoutez les lignes suivantes :

[ui]
username = Your Name <[email protected]>

Si vous ne voulez pas faire cela, vous pouvez toujours spécifier un nom d’utilisateur lorsque vous validez avec le drapeau -u, par exemple :

$ hg commit -u "Your Name <[email protected]>"

[1] : https://www.mercurial-scm.org/downloads [2] : http://tortoisehg.bitbucket.org/

Commencer

Voir aussi le [Tutoriel Mercurial][1]

Création d’un référentiel Mercurial

Un référentiel Mercurial est simplement un répertoire (appelé “répertoire de travail”) contenant un répertoire .hg avec des métadonnées sur le contenu du référentiel. Cela rend Mercurial très léger et facile à utiliser. Pour créer un nouveau référentiel, exécutez simplement :

$ hg init project

project est le nom du répertoire que vous souhaitez créer. Cela crée un répertoire project ainsi qu’un répertoire project/.hg contenant le référentiel lui-même.

   $ cd project
   $ echo Hello World > hello.txt
   $ hg stat
   ? hello.txt

Nous venons de créer un fichier hello.txt dans le référentiel et avons exécuté hg status (ou stat en abrégé) pour voir l’état actuel de notre dépôt. Comme vous pouvez le voir, hello.txt est annoté avec un ?, ce qui signifie que Mercurial n’en est pas encore conscient. La commande add enregistre ce nouveau fichier auprès de Mercurial afin qu’il soit inclus dans le prochain commit.

$ hg add hello.txt

Maintenant que Mercurial est au courant d’un fichier modifié, vous pouvez exécuter diff pour voir exactement ce qui a changé depuis le dernier commit - dans ce cas, nous ajoutons le contenu complet de hello.txt :

$ hg diff
diff -r 000000000000 hello.txt
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/hello.txt Sat Jul 23 01:38:44 2016 -0400
@@ -0,0 +1,1 @@
+Hello

Et une fois que nous en sommes satisfaits et prêts à enregistrer nos modifications, nous pouvons exécuter commit :

$ hg commit -m "Created a hello world file."

Notez que nous avons inclus un message de commit avec -m - si vous ne spécifiez pas -m Mercurial lancera un éditeur de texte dans lequel vous pourrez entrer un message de commit. Ceci est utile si vous souhaitez fournir un multi -message en ligne.

Une fois que vous avez validé vos modifications, elles ne s’affichent plus si vous exécutez hg stat puisque le référentiel est maintenant synchronisé avec le contenu du répertoire de travail. Vous pouvez exécuter log pour voir une liste des commits, et -v inclut des détails supplémentaires comme les fichiers touchés par chaque commit :

$ hg log -v
changeset:   0:b4c06cc77a42
tag:         tip
user:        Michael Diamond@Aodh <[email protected]>
date:        Sat Jul 23 01:44:23 2016 -0400
files:       hello.txt
description:
Created a hello world file.

[1] : https://www.mercurial-scm.org/wiki/Tutorial

Pousser et tirer

Mercurial facilite le partage de votre travail et l’apport de contributions d’autres développeurs. Cela implique trois étapes clés; [clonage][1], [tirer][2] et [pousser][3].

Cloner

Pour copier un référentiel distant sur votre disque local, vous le “clonez”. Pour ce faire, transmettez simplement l’URL distante à partir de laquelle vous souhaitez cloner. Pour cloner le code source de Mercurial, lancez simplement :

$ hg clone https://selenic.com/hg

Cela crée un répertoire hg local contenant une copie du référentiel Mercurial que vous pouvez construire, modifier et valider (bien que vous ne puissiez pas publier vos commits dans le référentiel parent).

Tirer

Une fois que vous avez extrait un référentiel, vous voudrez le garder synchronisé pendant que d’autres y publient des modifications. Vous pouvez retirer de nouvelles modifications en exécutant simplement :

$ hg pull

Cela extrait de nouveaux commits mais ne met pas à jour votre répertoire de travail, vous ne verrez donc aucun changement immédiatement. Pour [mettre à jour][4] le contenu du répertoire de travail, exécutez :

$ hg up

Ce qui met à jour votre répertoire de travail vers la dernière révision (la plus récente) du référentiel.

Vous pouvez également exécuter :

$ hg pull -u

Pour extraire de nouvelles modifications et mettre à jour le répertoire de travail en une seule étape.

Pousser

En supposant que vous ayez un accès en écriture au référentiel distant, vous pouvez publier tout commit que vous avez effectué localement sur le référentiel distant tout aussi facilement avec :

$ hg push

Cela télécharge vos modifications tant qu’il n’y a pas eu d’autres commits depuis la dernière fois que vous avez tiré. Si votre push est rejeté parce qu’il “créerait des têtes supplémentaires”, cela signifie que vous devez insérer ces nouvelles modifications et les fusionner avec les vôtres.

$ hg pull
$ hg merge  # this creates a new changeset merging your changes with the remote changes
$ hg commit -m "Merged in remote changes"
$ hg push

La plupart du temps, c’est tout ce que vous aurez à faire puisque Mercurial gère automatiquement la fusion de vos modifications, mais parfois vous devrez résoudre les conflits de fusion manuellement (voir le sujet sur la fusion). Si vous en avez besoin, vous pouvez toujours annuler une fusion et revenir à un répertoire de travail propre avec :

$ hg up -c

Mais rappelez-vous que c’est une opération destructrice ; tout changement dans le répertoire de travail sera effacé.

[1] : https://selenic.com/hg/help/clone [2] : https://selenic.com/hg/help/pull [3] : https://selenic.com/hg/help/push [4] : https://selenic.com/hg/help/update

Branchement

Lorsque nous commençons notre travail pour la première fois, nous devons décider s’il s’agit d’un domaine de travail distinct sur lequel nous travaillons ou s’il fait partie d’une ligne de travail existante. Si elle existe, nous pouvons travailler à partir de cette branche. Si c’est nouveau, nous ouvrirons une nouvelle branche.

Notre flux de travail est alors :

  • hg branch MyNewFeature
  • travail Travail travail
  • hg commit -m "committing my changes"
  • travail Travail travail
  • hg commit -m "plus de changements"

À ce stade, nous voulons pousser notre travail vers le serveur distant. Mais avant de pousser les modifications (ignorez ceci s’il s’agit d’une nouvelle branche que vous n’avez pas encore poussée), nous devons vérifier s’il y a des modifications entrantes dans cette branche. Nous pouvons vérifier cela avec :

hg incoming -b .

S’il y a des ensembles de modifications entrants sur notre branche, nous devons faire une extraction et rebaser nos modifications en haut de la liste des modifications.

hg pull -b . --rebase

Une fois cela fait ou s’il n’y a pas de changesets entrants, nous pouvons procéder au Push.

Nous voulons seulement pousser notre travail actuel, pas tout ce que nous avons déjà fait. Je ne pousse vraiment jamais tout mon référentiel, mais ma ligne de travail actuelle. Le raisonnement est que pousser l’ensemble du référentiel suppose que j’intègre plusieurs lignes de travail. Mais je veux seulement intégrer mon métier actuel, et je ne veux travailler que dans un métier à la fois.

Si c’est la première fois que je pousse cette branche:

hg push -b . --new-branch

Si j’ai déjà poussé cette branche:

hg push -b .

Le “-b”. commande signifie simplement pousser la branche actuelle, et rien d’autre.

Pour passer d’une branche de travail à l’autre :

hg update myBranchName