Ich arbeite mit Mercurial, aber ich glaube, dass beide Systeme im Grunde gleichwertig sind. Sie arbeiten beide mit den gleichen Abstraktionen: eine Reihe von Schnappschüssen (Changesets), die die Historie ausmachen. Jeder Änderungssatz weiß, woher er stammt (der übergeordnete Änderungssatz) und kann viele untergeordnete Änderungssätze haben. Der jüngste hg-git Erweiterung bietet eine bidirektionale Brücke zwischen Mercurial und Git und zeigt diesen Punkt auf.
Git hat einen starken Fokus auf die Veränderung dieses Verlaufsgraphen (mit allen Konsequenzen, die das mit sich bringt), während Mercurial das Umschreiben des Verlaufs nicht fördert, aber es ist trotzdem leicht zu machen und die Konsequenzen, die sich daraus ergeben, sind genau so, wie Sie sie erwarten sollten (d.h. wenn ich einen bereits vorhandenen Änderungssatz ändere, wird Ihr Client ihn als neu ansehen, wenn Sie ihn von mir abrufen). Mercurial hat also eine Vorspannung in Richtung nicht-destruktiver Befehle.
Was die leichtgewichtigen Zweige betrifft, so hat Mercurial Repositories unterstützt mit mehrere Filialen seit..., immer, denke ich. Git-Repositories mit mehreren Zweigen sind genau das: mehrere voneinander abweichende Entwicklungsstränge in einem einzigen Repository. Git fügt diesen Strängen dann Namen hinzu und ermöglicht es Ihnen, diese Namen aus der Ferne abzufragen. Die Lesezeichen Erweiterung für Mercurial fügt lokale Namen hinzu, und mit Mercurial 1.6 können Sie diese Lesezeichen verschieben, wenn Sie schieben/ziehen.
Ich verwende Linux, aber anscheinend ist TortoiseHg schneller und besser als das Git-Äquivalent unter Windows (aufgrund der besseren Nutzung des schlechten Windows-Dateisystems). Beide http://github.com y http://bitbucket.org bieten Online-Hosting, der Service bei Bitbucket ist großartig und reaktionsschnell (ich habe Github nicht ausprobiert).
Ich habe mich für Mercurial entschieden, weil es sich sauber und elegant anfühlt - die Shell/Perl/Ruby-Skripte, die ich mit Git bekommen habe, haben mich abgeschreckt. Werfen Sie einen Blick auf die git-instaweb.sh
Datei wenn Sie wissen wollen, was ich meine: es ist ein Shell Skript, das eine Rubinrot Skript, das, wie ich glaube, einen Webserver betreibt. Das Shell-Skript erzeugt ein weiteres Shell-Skript, um das erste Ruby-Skript zu starten. Außerdem gibt es ein wenig Perl , und das ist gut so.
Ich mag die Blog-Beitrag der Mercurial und Git mit James Bond und MacGyver vergleicht - Mercurial ist irgendwie unauffälliger als Git. Ich habe den Eindruck, dass die Leute, die Mercurial benutzen, nicht so leicht zu beeindrucken sind. Dies spiegelt sich darin wider, wie jedes System das tut, was Linus als "Der coolste Zusammenschluss aller Zeiten!" . In Git können Sie mit einem nicht verwandten Repository zusammenführen, indem Sie dies tun:
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
Diese Befehle sehen in meinen Augen ziemlich obskur aus. In Mercurial tun wir das:
hg pull --force <project-to-union-merge>
hg merge
hg commit
Beachten Sie, dass die Mercurial-Befehle einfach und überhaupt nicht speziell sind - das einzig Ungewöhnliche ist die --force
Flagge zu hg pull
Dies ist notwendig, da Mercurial sonst abbricht, wenn Sie von einem nicht verwandten Repository ziehen. Es sind Unterschiede wie diese, die Mercurial in meinen Augen eleganter erscheinen lassen.