Je travaille sur Mercurial, mais fondamentalement, je pense que les deux systèmes sont équivalents. Ils fonctionnent tous deux avec les mêmes abstractions : une série d'instantanés (changesets) qui constituent l'historique. Chaque changeset sait d'où il vient (le changeset parent) et peut avoir de nombreux changesets enfants. Le plus récent hg-git fournit un pont bidirectionnel entre Mercurial et Git et montre en quelque sorte ce point.
Git est fortement axé sur la mutation de cet historique (avec toutes les conséquences que cela implique) alors que Mercurial n'encourage pas la réécriture de l'historique, mais c'est facile à faire de toute façon et les conséquences de cette action sont exactement ce que vous devez attendre d'elles (c'est-à-dire que si je modifie un jeu de modifications que vous avez déjà, votre client le verra comme nouveau si vous le tirez de moi). Ainsi, Mercurial a un biais vers des commandes non-destructives.
En ce qui concerne les branches légères, Mercurial a pris en charge les dépôts avec plusieurs branches depuis..., toujours je pense. Les dépôts Git à branches multiples sont exactement cela : de multiples fils de développement divergents dans un seul dépôt. Git ajoute ensuite des noms à ces branches et vous permet d'interroger ces noms à distance. Le site Signets pour Mercurial ajoute des noms locaux, et avec Mercurial 1.6, vous pouvez déplacer ces signets lorsque vous poussez/tirez .
J'utilise Linux, mais apparemment TortoiseHg est plus rapide et meilleur que l'équivalent Git sous Windows (en raison d'une meilleure utilisation du pauvre système de fichiers de Windows). Les deux http://github.com et http://bitbucket.org pour l'hébergement en ligne, le service de Bitbucket est excellent et réactif (je n'ai pas essayé github).
J'ai choisi Mercurial parce qu'il semble propre et élégant - j'étais rebuté par les scripts shell/Perl/Ruby que j'obtenais avec Git. Essayez de jeter un coup d'œil à la git-instaweb.sh
fichier si vous voulez savoir ce que je veux dire : c'est une coquille script qui génère une Ruby script, qui je pense fait tourner un serveur web. Le shell script génère un autre shell script pour lancer le premier Ruby script. Il y a aussi un peu de Perl pour faire bonne mesure.
J'aime le article de blog qui compare Mercurial et Git à James Bond et MacGyver - Mercurial est en quelque sorte plus discret que Git. Il me semble que les personnes utilisant Mercurial ne sont pas si facilement impressionnées. Cela se reflète dans la façon dont chaque système fait ce que Linus a décrit comme étant "La fusion la plus cool du monde !" . Dans Git, vous pouvez fusionner avec un dépôt non lié en faisant :
git fetch <project-to-union-merge>
GIT_INDEX_FILE=.git/tmp-index git-read-tree FETCH_HEAD
GIT_INDEX_FILE=.git/tmp-index git-checkout-cache -a -u
git-update-cache --add -- (GIT_INDEX_FILE=.git/tmp-index git-ls-files)
cp .git/FETCH_HEAD .git/MERGE_HEAD
git commit
Ces commandes sont assez obscures à mes yeux. Dans Mercurial, c'est le cas :
hg pull --force <project-to-union-merge>
hg merge
hg commit
Remarquez que les commandes Mercurial sont simples et n'ont rien de spécial - la seule chose inhabituelle est la commande --force
pour hg pull
ce qui est nécessaire car Mercurial s'interrompt sinon lorsque vous tirez d'un dépôt non lié. Ce sont des différences comme celle-ci qui font que Mercurial me semble plus élégant.